如何从javascript调用IBM Watson服务

如何从javascript调用IBM Watson服务,javascript,java,jquery,cors,ibm-watson,Javascript,Java,Jquery,Cors,Ibm Watson,我正在使用IBMWatson服务实现一个虚拟代理。我的应用程序是使用Jquery、Angular JS和Java开发的。目前,我正在从中间层Java调用watson服务。但我想避免这种情况,直接从javascript调用。当我使用XML Http请求从javascript调用时,我得到了CORS错误。如何解决这个问题 下面是我的代码: var username = "uid"; var password = "pwd"; var xhr = new XMLHttpRequest(); xhr.o

我正在使用IBMWatson服务实现一个虚拟代理。我的应用程序是使用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 developerWorks上关于使用Watson问答服务的本教程-

IBM Watson服务尚不支持从基于浏览器的应用程序获取跨源请求

请参阅以下网址的答案:

我们不支持CORS,我们正在研究它,但在您的情况下,视觉识别还不受支持

这意味着一些服务支持COR,但我猜您尝试的不是其中之一

因此,除了您现在所说的(而是从服务器端Java层访问服务)之外,从web应用程序中运行的JavaScript代码获取服务的唯一选项是,使用或类似的方式设置您自己的服务器端代理,或者通过开放的CORS代理发送您的请求,如(不过,如果您的请求中包含您不想向第三方代理服务的运营商公开的任何类型的身份验证令牌,您不太可能希望这样做)

这种代理的工作方式是,不使用在客户端JavaScript代码中指定的请求URL,而是指定代理URL,如,代理将实际请求发送到服务,获取响应,并将所需的
Access Control Allow Origin
response头和其他头添加到它和pa穿上它

因此,浏览器看到的是包含CORS头的响应

有更多关于CORS工作原理的详细信息,但需要知道的主要是浏览器是CORS实施点。因此,在Watson服务的情况下,浏览器实际上会从Watson API获得响应。您可以在浏览器中使用devtools查看响应,但浏览器会将响应公开给您的cli仅当响应包含
Access Control Allow Origin
response头时,才使用ent端JavaScript代码,以指示发送响应的服务器已选择从web应用程序中运行的客户端JavaScript接收跨源请求

这就是为什么不管怎样,所有的
xhr.setRequestHeader(“上面XHR代码段中的Access Control Allow-
行需要删除,因为
Access Control Allow-*
头是响应头,而不是请求头;在请求中将它们发送到服务器对CORS没有影响,因为如上所述,浏览器是CORS实施点,而不是服务器

因此,服务器并不是从浏览器收到一些请求,然后说,好吧,我看到这个请求有正确的标题,所以我会允许它。相反,服务器允许来自浏览器的所有请求,就像它允许来自非浏览器工具(如Java代码、curl或Postman)的所有请求一样(当然,只要它们经过身份验证)并发送响应


区别在于,当一个非基于浏览器的应用程序收到响应时,如果它缺少
访问控制允许源代码
标题,它不会拒绝让你访问响应。但是如果它没有,浏览器会拒绝让你的客户端JavaScript web应用程序代码访问响应。

你可能还想看看其中的一些e可在GitHub上获得。

一些Watson服务支持CORS,其他则不支持。但是,通过CORS访问时,必须使用身份验证令牌,而不是用户名/密码组合*

这是支持CORS的服务的部分列表:

下面是几个使用Node.js SDK的示例:

  • 网页:
  • 浏览:
此外,还有大量使用Speech JavaScript SDK的示例:


*有两个服务使用API键,而不是用户名/密码组合。在这种情况下,如果服务支持CORS,您可以直接从客户端代码使用API键。

这是在node js中。我想要在jquery或angular js中使用