使用自定义 headers ReactJS 获取 GET 请求
Fetch GET Request with custom headers ReactJS
我正在尝试向 API 发送 GET 请求,但是当我在代码中添加自定义 headers 时,发生了一些奇怪的事情。
某处请求方法在到达 Web 服务器时更改为 OPTIONS。
但是当我在没有 headers 的情况下执行相同操作时,它将是 GET 类型。
当我使用应用程序邮递员(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
})
<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>
服务器日志输出(headers):
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" "-"
服务器日志输出(无headers):
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-the-response-url
https://github.com/taylorhakes/promise-polyfill
我在这里错过了什么?这对我来说都是正确的。
我正在使用 firefox 开发版通过 运行 通过 NPM start
测试 Reactjs 应用程序
您可能想在您拥有 http://localhost:8080/api/app
节点应用 运行.
的服务器上安装 cors
npm 包 https://www.npmjs.com/package/cors
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests 详细说明了这里发生的事情:您的 appID
和 authorizationkey
请求 headers 正在触发您的浏览器发送 CORS 预检 OPTIONS
请求在发送 GET
.
之前
要处理 OPTIONS
请求,您可以安装 cors
npm 包并按照 https://www.npmjs.com/package/cors#enabling-cors-pre-flight 中的说明进行配置:
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 后端,而是使用带有 php-fpm 的普通 Nginx。
但答案解释了带有自定义 header 的请求如何始终首先执行 OPTIONS 请求以验证是否接受集合 header 名称,因此我不得不更改网络服务器中的响应返回包含正确 header 的 204 代码。
没有它会命中我的 PHP 代码,其中身份验证将失败并导致 403 代码,因为缺少 headers 以及所使用的内容和请求方法。
这是我添加到 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;
}
}
我知道它远非完美,但现在它已经成功了。再次感谢您为我指明了正确的方向。
我正在尝试向 API 发送 GET 请求,但是当我在代码中添加自定义 headers 时,发生了一些奇怪的事情。 某处请求方法在到达 Web 服务器时更改为 OPTIONS。
但是当我在没有 headers 的情况下执行相同操作时,它将是 GET 类型。 当我使用应用程序邮递员(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
})
<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>
服务器日志输出(headers):
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" "-"
服务器日志输出(无headers):
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-the-response-url
https://github.com/taylorhakes/promise-polyfill
我在这里错过了什么?这对我来说都是正确的。
我正在使用 firefox 开发版通过 运行 通过 NPM start
测试 Reactjs 应用程序您可能想在您拥有 http://localhost:8080/api/app
节点应用 运行.
cors
npm 包 https://www.npmjs.com/package/cors
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests 详细说明了这里发生的事情:您的 appID
和 authorizationkey
请求 headers 正在触发您的浏览器发送 CORS 预检 OPTIONS
请求在发送 GET
.
要处理 OPTIONS
请求,您可以安装 cors
npm 包并按照 https://www.npmjs.com/package/cors#enabling-cors-pre-flight 中的说明进行配置:
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 后端,而是使用带有 php-fpm 的普通 Nginx。
但答案解释了带有自定义 header 的请求如何始终首先执行 OPTIONS 请求以验证是否接受集合 header 名称,因此我不得不更改网络服务器中的响应返回包含正确 header 的 204 代码。 没有它会命中我的 PHP 代码,其中身份验证将失败并导致 403 代码,因为缺少 headers 以及所使用的内容和请求方法。
这是我添加到 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;
}
}
我知道它远非完美,但现在它已经成功了。再次感谢您为我指明了正确的方向。