2016-05-17 62 views
-1

我正在使用角js $ http服务的雅虎获取请求到雅虎财务休息api但是我得到http状态码405作为回应。

下面是完整的堆栈跟踪。

index.html#/tab/stock:1 XMLHttpRequest cannot load http://finance.yahoo.com/webservice/v1/symbols/SUZLON.NS/quote?format=json&view=detail. 
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' 
header is present on the requested resource. 
Origin 'http://localhost:8080' is therefore not allowed access. 
The response had HTTP status code 405. 

以下是我的代码,使ajax调用。

var config = { 
      headers : { 
       'Access-Control-Allow-Origin' : '*', 
       'Accept' : 'application/json;odata=verbose', 
       "HOST" : "finance.yahoo.com" 
      } 
     }; 

    var promise = null; 
    promise = $http.get('http://finance.yahoo.com/webservice/v1/symbols/SUZLON.NS/quote?format=json&view=detail',config); 
    return promise; 

我能够使ajax调用谷歌金融API,但雅虎金融API失败。

我需要为我的配置对象设置任何标题吗? 或者雅虎Rest API端返回Http 405有什么不同?

下面的代码谷歌API调用工作正常,无需设置任何标题。

getNseQuote : function(nseScriptCode) { 
    console.log("Inside nseScriptCode : " + nseScriptCode); 

    var promise = null; 
    promise = $http.get('http://www.google.com/finance/info?q=NSE:' + encodeURIComponent(nseScriptCode)); 
    return promise; 
} 
+1

错误消息很清楚地解释了什么是错的。研究CORS和/或相同的原产地政策。 TLDR:你不能用你的客户端JavaScript解决这个问题,并在配置客户端设置这些头文件是没有意义的。 –

+0

它说:“预检响应中的Access-Control-Allow-Headers不允许请求标头字段Access-Control-Allow-Origin。” “Origin'http:// localhost:8080'因此不被允许访问”我可以理解,我本地主机:8080不允许的来源。如果我从finance.yahoo运行这将工作。那么这是否意味着这个剩余的api只能用于内部使用? –

+0

任何解决这个问题的方法都是通过在它周围添加一些包装来完成的。 –

回答

0

您可以使用this extension for chrome link。它允许您进行跨域请求。在您将API与应用程序集成之前,请测试API URL,看看它是否正在使用第三方工具,如Postman,它最适合测试API调用。

关于您的错误 “对预检请求的响应未通过访问控制检查:否'Access-Control-Allow-Origin' 标题存在于请求的资源上”这意味着服务器未配置为处理pre -flight request.Pre-flight请求是由浏览器在特殊情况下完成的请求,例如当您请求来自不同域的数据(当您正在执行GET/POST以外的请求以及在您的请求中使用任何自定义标头等)时仅安全目的(我想)..

因此,在你的情况下,你应该使用代理服务器,你可以使用任何可用的开源软件包......在我的情况下,我使用的是node-http-proxy。浏览器调用代理服务器,代理服务器从实际的服务器并将其返回到浏览器..它很容易做一点修补...

相关问题