【发布时间】:2019-10-05 14:34:20
【问题描述】:
我对 CORS 很陌生。我正在构建一个 React 应用程序,它只是将数据发布到后端 API。根据 API 文档,我必须发送一个 BASIC Authentication Header 以及我正在做的请求。当我通过 POSTMAN 发送请求时,请求工作得很好。但是当我从我的应用程序发出相同的请求时,它会显示无效的 API 密钥。以下是我的代码:
App.js:
import React from 'react';
class App extends React.Component{
state = {
data: 'data'
};
handleClick = async () =>{
const res = await fetch('https://myapi.com/post',{
method: 'POST',
body: JSON.stringify({tp:'0'}),
mode: 'cors',
headers: {
content-type:'application/x-www-form-urlencoded',
Authorization : 'Basic ' + new Buffer('username:password').toString(base64)
}
});
const data = await res.json();
this.setState({data});
}
render() {
return(
<div>
<p>{this.state.data}</p>
<button onClick={this.handleClick}>Post</button>
</div>
);
}
}
我调查了这个问题,发现发送请求时没有设置标头。当进一步深入研究时,我发现上述请求不是一个简单的请求,因此浏览器向服务器发出了预检 OPTIONS 请求。我不知道服务器如何处理请求,但我认为服务器未配置为处理预检选项。我可能错了。我无权访问服务器代码。通过 CORS Anywhere 代理和 POSTMAN 客户端的相同请求工作正常,但在使用实际应用程序时却不行。我使用 create-react-app 来设置样板。
在通过应用程序发送请求时,我得到的只是一个无效的 API 令牌错误。
任何有关如何将标头传递到服务器的帮助将不胜感激。
【问题讨论】:
-
API是自己开发的还是第三方API?
-
第三方 API
-
您可能希望将标头包装在 Headers 对象中:observablehq.com/@mbostock/fetch-with-basic-auth 和 stackoverflow.com/a/34815964/6511985
-
是的,试过了。不工作
-
有趣。您假设的问题当然是可能的,他们确实没有正确处理 OPTION 预检请求。但是他们应该在更早的阶段与其他客户一起面临这个问题。至少,如果他们有更多的人使用 Web 界面使用 API。或者它是为你打造的?
标签: javascript reactjs post cors fetch