- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 IBM Watson 服务实现虚拟代理。我的应用程序是使用 Jquery、Angular JS 和 Java 开发的。目前我正在从 java 的中间层调用 watson 服务。但我想避免这种情况并直接从 javascript 调用。当我使用 XML Http 请求从 javascript 调用时,出现 CORS 错误。如何解决这个问题?
下面是我的代码:
var username = "uid";
var password = "pwd";
var xhr = new XMLHttpRequest();
xhr.open('GET', 'url');
//xhr.withCredentials = true;
xhr.setRequestHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Origin,Content-Type, application/json, Authorization");
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader('Access-Control-Allow-Credentials', '*');
xhr.setRequestHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
xhr.setRequestHeader('Content-Type', undefined);
xhr.setRequestHeader('Authorization', 'Basic ' + btoa(username + " " + password));
xhr.send('"query":"hi"');
最佳答案
IBM Watson 服务尚不支持从基于浏览器的应用获取跨源请求。
在 Can't access IBM Watson API locally due to CORS on a Rails/AJAX App 查看答案:
We don't support CORS, we are working on it but in your case Visual Recognition is not supported yet.
这意味着某些服务支持 CORS,但我想您尝试过的不是其中之一。
因此,除了您所说的您现在正在做的事情(改为从您的服务器端 Java 层访问服务)之外,您从 Web 应用程序中运行的 JavaScript 代码获取服务的唯一选择是,设置您的自己的服务器端代理 https://github.com/Rob--W/cors-anywhere之类的,或者通过一个开放的 CORS 代理发送你的请求,比如 https://cors-anywhere.herokuapp.com/ (尽管如果您的请求包含您不想暴露给第三方代理服务运营商的任何类型的身份验证 token ,您不太可能希望这样做)。
这种代理的工作方式是,而不是使用 https://gateway.watsonplatform.net/some/api作为在客户端 JavaScript 代码中指定的请求 URL,您改为指定代理 URL,例如 https://cors-anywhere.herokuapp.com/https://gateway.watsonplatform.net/some/api ,代理将实际请求发送到服务,取回响应,并向其添加所需的 Access-Control-Allow-Origin
响应 header 和其他 header 并将其传递。
因此浏览器看到的是包含 CORS header 的响应。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS有更多关于 CORS 工作原理的细节,但要知道的主要事情是浏览器是 CORS 的执行点。因此,在使用 Watson 服务的情况下,浏览器实际上将从 Watson API 获取响应——您将能够在浏览器中使用 devtools 来查看响应——但浏览器会将响应公开给您的客户端 JavaScript 代码仅当响应包含 Access-Control-Allow-Origin
响应 header 以指示发送响应的服务器已选择接收来自 Web 应用程序中运行的客户端 JavaScript 的跨域请求时。
所以这就是为什么,无论如何,您上面的 XHR 代码片段中的所有 xhr.setRequestHeader("Access-Control-Allow-
行都需要被删除——因为 Access-Control- Allow-*
header 是响应 header ,而不是请求 header ;在请求中将它们发送到服务器对 CORS 没有影响,因为如上所述,浏览器是 CORS 执行点,而不是服务器。
所以服务器从浏览器接收到一些请求并说,好的,我看到这个请求有正确的 header ,所以我会允许它。相反,服务器允许来自浏览器的所有请求,就像它允许来自非浏览器工具(例如您的 Java 代码或 curl 或 Postman 或其他任何工具)的所有请求一样(当然只要它们经过身份验证)并发送响应。
不同之处在于,当非基于浏览器的应用程序收到响应时,如果它缺少 Access-Control-Allow-Origin
header ,它不会拒绝让您访问该响应。但是如果缺少响应,浏览器会拒绝让您的客户端 JavaScript 网络应用程序代码访问响应。
关于javascript - 如何从 javascript 调用 IBM Watson 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43105146/
IBM Watson 和 IBM Inforsphere BigInsights (IBM Hadoop)/Streams 之间有什么区别? Watson 带来了 BigInsights 无法提供的哪
据我所知,Rational 是一种测试工具,而 Rational Rose 是一种建模工具。 最佳答案 Rational 是一家为软件开发生命周期制作工具的公司。 Rational Rose 就是这样
我尝试将 ibm-eventstreams-dev v 0.1.1 安装到 IBM Cloud Private 中,但收到一条错误消息: 内部服务错误:图表与 Tiller v2.6.0 不兼容 最佳
我正在尝试配置连接到集群MQ的集群Websphere应用程序服务器。 但是,我所掌握的信息是两个具有不同主机名,服务器通道和队列管理器的MQ实例的详细信息,这些主机名属于同一MQ集群名称。 在Webs
我想问问你们中的一些聪明人 :) 是否可以在 IBM Connections 文件中使用目录结构。还有图书馆,但我无法通过 webdav/smdb 映射它,也许这是关于我的信息差距,但我可以安装桌面插
我一次又一次地读到 IBM i 是一个支持多种编程语言的现代系统。除了 COBOL 和 RPG 之外,我如何确定哪些可供我使用? 维基百科上提供了一份 list ,我对 C、C++、BASIC、Sma
是否可以将 IBM HTTP 服务器设置为非 IBM Websphere 应用程序服务器(Glassfish、Apache Tomcat 或其他 Java 应用程序服务器)的前端?IBM 支持吗?我试
我有一个在 IBM Bluemix 上运行的简单 JSF 应用程序,与以下 J2EE 依赖项配合良好。 javax javaee-web-api 6.
我正在查看一个 RPG 程序。有一些这样的子程序:有没有工具哪个会将其创建为一个过程,可以在单独的过程中使用? C Eval FinQty# = 0
我正在设计一个新的体系结构大数据,我的客户将其作为IBM MQ代理使用。我们曾经在大数据架构中与Kafka一起工作,因为我想它比其他选择更快,更可靠,更强大,并且因为风暴和火花流在Kafka中更容易工
我偶然发现了一些 FMTDTA,它似乎是一种查询/排序语言,早于旧 RPG 系统中的 SQL。我试图解开它的用法。 例子: 物理文件布局: ORNO S 9 0 1
除了许可之外,IBM Worklight 的企业版和消费者版之间在功能方面是否存在任何差异? 最佳答案 企业版的销售目的是在组织内使用 (B2E)。许可证是“每台设备”。消费者版旨在以 B2C 的形式
我希望使用 IBM Worklight v5.0.5 Fix pack 1 设置 Eclipse 开发环境。 我可以获得有关旧版本 Worklight 的安装链接的一些指示吗? 最佳答案 查看下面的可
是否可以保留已检索且不再位于队列中的消息历史记录(包含消息内容将是完美的)? 在应用程序中,我可以看到发送者何时尝试将消息放入队列以及接收者何时尝试拾取消息,但我想查看消息何时真正到达队列以及消息何时
我正在向远程队列发送消息,但我无法控制该队列。 我发送一个 xml 文件作为消息,但是当应用程序读取消息时,它会得到一个消息头,例如 jms_text \0\0\0lqueue:///TEST128
在什么情况下队列管理器可能会失去与集群环境中存储库的连接?我的环境中队列管理器经常失去与存储库的连接,我需要刷新集群来修复此问题并重新建立与集群中其他队列管理器的通信。 我们的集群有 100 个队列管
我们正在为助手实现 Watson 技术,以帮助某些用户。 对话有些复杂,有时需要针对某些问题做跳答,这样做的坏处是用户可以再问一遍问题,以防不明白这就是问题所在。 当想进入后续进入的节点时,该节点进行
我们有一个启用了 DevOps 交付管道的 NodeJS Cloud Foundry 应用程序。 最初,我们将管道设置为使用 Bluemix 中交付管道的 Active Deploy 扩展来部署应用程
请注意,此问题特定于“IBM DB2 for i”,即 IBM i 操作系统的 version of DB2 . 下面的屏幕截图显示了一个故意错误的 INSERT 语句,它产生了 SQL0407 的
我想使用 IBM Websphere MQ 客户端 v7.5。我正在编写独立的 JMS 客户端应用程序来发送和使用来自 IBM WebsphereMQ 服务器的消息(它在其他地方运行,但我有权发送/接
我是一名优秀的程序员,十分优秀!