使用SSL向第三方API发出POST请求失败:“Access-Control-Allow-Origin不允许使用原始http:// localhost:5000”。

时间:2013-11-29 16:44:22

标签: http rest angularjs ssl cors

我正在使用AngularJS和Restangular开发一个网站,并且第一次尝试将AJAX请求发送到第三方Web服务。此外,它使用SSL证书。

请求在此消息的末尾。它发回错误0,并显示在控制台中:

OPTIONS https://identitysso-strongauth.betfair.com/api/certlogin Origin http://localhost:5000 is not allowed by Access-Control-Allow-Origin. angular.min.js:100

XMLHttpRequest cannot load https://identitysso-strongauth.betfair.com/api/certlogin. Origin http://localhost:5000 is not allowed by Access-Control-Allow-Origin. 

我知道这是一个CORS情况。这是浏览器不想从该服务器获取信息。但我不知道如何使其发挥作用。

我尝试使用curl发送类似的POST请求,但它确实有效。我必须做的一件事就是表明我的SSL证书在哪里。啊!写这篇文章,我认为Chrome可能需要知道证书的位置。我在“设置”中添加了它们。有一个变化。现在,请求是“待定”,并且从未收到任何响应。控制台中没有更多错误消息。

请求永远在等待......不知道该怎么做。我将继续调查,但如果有人有想法(甚至是我可以用来调查的工具提案),那将非常受欢迎,因为我几乎是这些事情的初学者。

----------------------------------------------- --------------------------------------

以下是在Chrome中设置SSL证书之前和之后的请求:

Request URL:https://identitysso-strongauth.betfair.com/api/certlogin
Request Method:OPTIONS
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,fr;q=0.6
Access-Control-Request-Headers:x-application, accept, origin, x-requested-with, content-type
Access-Control-Request-Method:POST
Cache-Control:no-cache
Connection:keep-alive
Host:identitysso-strongauth.betfair.com
Origin:http://localhost:5000
Pragma:no-cache
Referer:http://localhost:5000/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36

之后:

Request URL:https://identitysso-strongauth.betfair.com/api/certlogin
Request Headersview source
Access-Control-Request-Headers:x-application, accept, origin, x-requested-with, content-type
Access-Control-Request-Method:POST
Cache-Control:no-cache
Origin:http://localhost:5000
Pragma:no-cache
Referer:http://localhost:5000/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36

我不知道为什么请求不完全相同,因为我的代码完全一样。

1 个答案:

答案 0 :(得分:1)

问题是您的浏览器不允许httpXmlRequest对象向另一个来源发出请求。这确实是CORS / SOP。这可以通过使用在第三方站点(预检)上返回的特殊标头来解决,该标头向浏览器指示它是可以的。但是,我强烈怀疑betfair.com会为你做这件事。

我建议在您的网站上使用相同的来源(服务器:端口)创建一个代理,该请求将请求(并检索响应)转发到此第三方网站。这可以是带代码的简单页面。可以在http://www.west-wind.com/presentations/dotnetWebRequest/dotnetWebRequest.htm上找到.NET的示例,但这取决于Web服务器。

祝你好运,