IBM Watson Conversation API:“预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权”
Posted
技术标签:
【中文标题】IBM Watson Conversation API:“预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权”【英文标题】:IBM Watson Conversation API: “Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response” 【发布时间】:2017-07-10 13:44:17 【问题描述】:我创建了一个连接到 Watson REST API 的 React-Native 应用程序。使用作为 ReactNative 一部分的 fetch 库,一切都可以很好地获取 Workspaces 列表,如下所示:
const myAuth = new Buffer(USR+':'+PWD).toString('base64');
const myInit =
method: 'GET',
headers:
'Accept': 'application/json',
'Content-Type': 'application/json',
'Origin': '',
'Authorization': 'Basic ' + myAuth,
;
return fetch(URL, myInit)
.then((response) => response.json())
.then((responseJson) => ...
我现在正在转向 React(而不是 ReactNative)和 whatwg-fetch 库。相同的代码不起作用。首先我得到的错误是:
预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权。
然后阅读有关此类问题的数十条线程,它就变成了黑魔法。为 Access-Control-Allow-Methods、Access-Control-Allow-Headers 等添加标头。到目前为止,还没有真正奏效。最终问题变成了:
预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 access-control-allow-headers。
有人可以给我指出一个可行的示例或代码吗?
==============
更新...
谢谢@sideshowbarker 和@FakeRainBrigand。我想那么服务器端对于浏览器客户端应用程序来说是必须的。
【问题讨论】:
【参考方案1】:浏览器拒绝发送您的请求,因为您发送请求的服务器没有启用 CORS,至少没有启用这些标头。
不修改目标服务器的唯一解决方案是编写自己的服务器,代表客户端发出请求。
【讨论】:
那么为什么它与 React-Native fetch @FakeRainBrigand 一起工作? React-Native 应用程序在同源 Web 安全模型之外运行,该模型阻止 Web 应用程序发出跨域请求(除非发送请求的站点通过使用Access-Control-Allow-Origin
标头响应来选择加入) . React 在浏览器的 web-app 代码中运行,浏览器是唯一强制执行跨域/CORS 限制的地方。React-Native 应用程序在浏览器外部运行,因此它们不受任何跨域限制的约束(它们实际上并不从任何来源运行,因此“跨域”的概念不适用于它们。【参考方案2】:
删除任何设置Access-Control-Allow-Headers
请求标头的客户端代码。
标头是启用 CORS 的服务器发送的响应标头。你不是从客户端设置的。
根据问题中引用的错误消息,听起来服务器可能已经正确配置为发送正确的 Access-Control-*
标头。 (否则,您会收到一条错误消息,指出响应中没有 Access-Control-Allow-Origin
。)
此时从问题中的信息中可以识别的唯一错误就是请求的问题,其中包括不应存在的 Access-Control-Allow-Headers
请求标头。
【讨论】:
当我删除它时 - 我回到“请求标头字段 Authorization is not allowed by Access-Control-Allow-Headers in preflight response.” 是的,所以我猜 API 只是没有 CORS 支持。至少如果它是ibm.com/watson/developercloud/conversation/api/v1,那么没有迹象表明支持 CORS,也没有从浏览器中运行的 web 应用客户端代码中使用 API 的示例。以上是关于IBM Watson Conversation API:“预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权”的主要内容,如果未能解决你的问题,请参考以下文章
我如何使用 Watson Conversation 确定否定答案
如何在 iOS Swift 中使用 Watson Conversation?
当用户输入输入时,如何使 Watson Conversation Api 调用 Web 应用程序 URL?
IBM BigInsights (IBM Hadoop) 与 IBM Watson