【问题标题】:Can't connect to API using React.js fetch method无法使用 React.js 获取方法连接到 API
【发布时间】:2018-11-05 18:31:14
【问题描述】:

我正在尝试使用 fetch() 通过 react.js 连接到缓冲区的 API (https://buffer.com/developers/api/oauth),但收到 400 错误响应。

这是在我的本地主机上运行的,但可以从 Internet 访问该站点。

这是我的代码:

const queryString = require('query-string');
        const parsed = queryString.parse(window.location.search);

const buffer_data = {
                client_id: BUFFER_CLIENT_ID,
                client_secret: BUFFER_CLIENT_SECRET,
                redirect_uri: BUFFER_CALLBACK_URL,
                code: parsed.code,
                grant_type: 'authorization_code',
};

fetch(BUFFER_ACCESS_TOKEN_URL, {
                method: 'post',
                body: JSON.stringify(buffer_data),
              }).then( data => {
                console.log('data response ' + data);
                return data.json();
            }).then( response => {
                console.log(response);
});

下面是回复:

{"error":"invalid_request","error_description":"无效的授权类型 参数或参数缺失”}

控制台会打印:

无法加载https://api.bufferapp.com/1/oauth2/token.json:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://myserver.com” 使用权。响应的 HTTP 状态代码为 400。如果响应不透明 满足您的需求,将请求的模式设置为“no-cors”以获取 禁用 CORS 的资源。

我尝试了很多事情,比如不序列化数据、尝试发送许多不同的标头、使用 CORS chrome 插件等

在进行反应编码之前,我已经使用 PHP 成功连接,但为此我必须在我的服务器上添加 SSL 证书。

我也愿意使用任何图书馆,但还没有找到一个来做这项工作。或者任何其他的获取方法,比如 axios?

非常感谢!

【问题讨论】:

  • 刚试过,也没用
  • 返回的 400 错误是您唯一需要修复的问题。您没有 CORS 问题。 400 表示错误请求——服务器表明它收到的请求不是它期望或可以处理的格式。服务器默认只将 Access-Control-Allow-Origin 标头添加到 2xx 成功响应,而不是 4xx 或 5xx 错误。
  • 好的。发送的参数正是需要的,因为它在 PHP 中工作。我猜它们是以错误的格式发送的,但已经尝试将其作为 json、字符串化和 var1=value&var2=value 发送,但也没有用。所以不知道我到底做错了什么,有什么猜测吗?
  • 您是否尝试将Content-Type 设置为application/x-www-form-urlencoded?并像这样设置grant_type grant_type=${authorization_code}&code=$parsed.code}&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}?
  • 也没有用。使用 chrome 的 cors 插件暂时解决了这个问题,但我仍在寻找永久解决方案

标签: reactjs api fetch


【解决方案1】:

我不知道您使用的是哪个浏览器,但您可能想添加Allow-Control-Allow-Origin

适用于您的 chrome 浏览器(如果您使用的是 chrome)。当您将 localhost 与 chrome 一起使用时,似乎会出现一些问题。

另外,我强烈建议使用 axios 来获取 API,它带有一些简单的错误日志,可以帮助您快速确定问题。

您好!

【讨论】:

  • 也试过了,还是不行。我正在使用铬。你介意分享一下这在 axios 上的样子吗?
  • 你检查过这个github.com/auth0-community/auth0-chrome-sample/issues/11了吗? axios 非常简单,你总是用 axios.get、axios.put、axios.update 等调用不同的 api 点,并通过 setState 更新类状态。那里有很多很好的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多