我试图向API发送GET请求,但当我在代码中添加自定义头时,发生了一些奇怪的事情。在某个地方,请求方法在到达web服务器时会更改为选项。
但是当我在没有标题的情况下执行相同的操作时,它将是一个GET类型。当我使用应用程序postman(API开发工具)时,请求工作正常!
请求代码:
let token = this.generateClientToken(privateKey, message);
let myheaders = {
"appID": appID,
"authorizationkey": token
}
fetch('http://localhost:8080/api/app/postman', {
method: "GET",
// body: JSON.stringify(''),
headers: myheaders
}).then(function(response) {
console.log(response.status); //=> number 100–599
console.log(response.statusText); //=> String
console.log(response.headers); //=> Headers
console.log(response.url); //=> String
return response.text()
}, function(error) {
console.log(error.message); //=> String
})
html prettyprint-override"><script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
服务器日志输出(带标题):
worker_1 | 172.18.0.4 - 17/Mar/2017:15:47:44 +0000 "OPTIONS /index.php" 403
web_1 | 172.18.0.1 - - [17/Mar/2017:15:47:44 +0000] "OPTIONS /api/app/postman HTTP/1.1" 403 5 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:54.0) Gecko/20100101 Firefox/54.0" "-"
服务器日志输出(不带标题):
worker_1 | 172.18.0.4 - 17/Mar/2017:16:01:49 +0000 "GET /index.php" 403
web_1 | 172.18.0.1 - - [17/Mar/2017:16:01:49 +0000] "GET /api/app/postman HTTP/1.1" 403 5 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:54.0) Gecko/20100101 Firefox/54.0" "-"
添加了NPM模块,用于在额外浏览器中获取支持:
https://github.com/github/fetch#obtaining-响应url
https://github.com/taylorhakes/promise-polyfill
我错过了什么?在我看来这一切都是正确的。
我使用火狐开发版测试Reactjs应用程序运行它与NPM启动
您可能想安装cors
npm包https://www.npmjs.com/package/cors 在您拥有http://localhost:8080/api/app
节点应用程序正在运行。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests有关于这里发生的事情的详细信息:您的appID
和Authizationkey
请求标头触发您的浏览器在发送GET
之前发送CORS预飞行OPTIONS
请求。
要处理该OPTIONS
请求,您可以安装cors
npm包,并按照https://www.npmjs.com/package/cors#enabling-cors飞行前对其进行配置:
var express = require('express')
, cors = require('cors')
, app = express();
app.options('*', cors()); // include before other routes
app.listen(80, function(){
console.log('CORS-enabled web server listening on port 80');
});
被接受的答案告诉我解决方案,我不是使用nodeJS后端,而是使用带有phpfpm的普通Nginx。
但是答案解释了一个具有自定义头的请求如何总是首先执行一个选项请求来验证对设置头名称的接受,因此我必须更改Web服务器中的响应,以返回包含正确头的204代码。若并没有它,我的PHP代码将受到攻击,身份验证将失败,并导致403代码,因为使用的内容和请求方法缺少标题。
这是我添加到Nginx主机以使其工作的内容:
location ~ \.php$ {
add_header 'Access-Control-Allow-Origin' "*";
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
add_header 'Access-Control-Allow-Headers' 'appID,authorizationkey';
if ($request_method = 'OPTIONS') {
return 204;
}
}
我知道这还远远不够完美,但现在它已经成功了。再次感谢你为我指明了正确的方向。
这是我的AngularJS代码(如果我删除header选项,它可以正常工作)。 请求如下: 答复: 我添加了和头,但请求仍然失败 大写字母(我的意思是vs)是否会导致失败?如果是,我如何才能让AngularJS停止这样做? Go服务器路由代码:
我需要发送一个GET请求,标题是:。我期待服务器的XML响应。我用邮递员测试了请求和响应,一切都很好。但是,当我尝试在Spring中使用执行此操作时,我总是会收到400个错误请求。的异常是: 我的代码: 调试消息将标头显示为,这似乎是正确的。我想知道我的请求出了什么问题,以及是否有一种方法可以看到在线调试的请求。
使用方法 在koa中,获取GET请求数据源头是koa中request对象中的query方法或querystring方法,query返回是格式化好的参数对象,querystring返回的是请求字符串,由于ctx对request的API有直接引用的方式,所以获取GET请求数据有两个途径。 1.是从上下文中直接获取 请求对象ctx.query,返回如 { a:1, b:2 } 请求字符串 ctx.que
问题内容: 我在使用OAuth编写的应用程序中使用了许多HTTP请求。目前,我以相同的方式发送GET和POST请求: 这工作正常。我成功地发布和获取。但是,我担心我没有正确执行POST。我需要在上面的代码中包含以下if语句吗? 如果是这样,为什么?有什么不同?我将不胜感激任何反馈。 谢谢! 问题答案: 内容类型必须与的 实际 格式匹配。仅当内容类型实际经过url编码时,才需要内容类型。例如,您对P
问题内容: 我想知道是否可以通过添加自定义信息来配置所有$ http请求标头。像config这样的东西: 但是对于所有$ http呼叫,我将使用不同的服务。我敢肯定有一个解决方案:D。谢谢 问题答案: 您可以创建一个拦截器来扩展标题:
问题内容: 我使用自定义标头实现了POST请求,因为我们使用OAuth2,并且必须在标头内的每个请求中发送访问令牌。在这种情况下,我必须使用自定义标头。 HTTP标头字段的访问令牌值对我不起作用。服务器生成错误,因为带有访问令牌的OAuth标头信息不可用。 但是我的代码有什么错误呢? 这是我当前的代码: 问题答案: 这是我如何与自定义标头一起使用的示例: 现在,无论何时发出请求,它都会使用指定的标