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

使用 ibm_watson python 包中的“ToneAnalyzerV3”,如何排除特定音调?

IBM-Watson 云产品中输入所需的数据格式是啥?