带有远程URL的JSONP不起作用

在以下代码中,有一个以JSON格式返回结果的url。 我想阅读JSON并在我的代码中解析它。 但是,当我运行代码时,结果为空。 似乎我无法发送跨域AJAX请求!

我还尝试在代码中包含Access-Control-Allow-Credentials: true ,方法是编写xhrFields: { withCredentials: true }, crossDomain: true, ,但是它再次起作用。 它给出以下错误: Error: jQuery111209679192922043036_1428845360268 was not called

  $.ajax( { url:"http://ec.europa.eu/semantic_webgate/query/sparql?dataset=rasff&format=json&limit=10&query=select%20?p%20where%20+{+?s%20?p%20?o+}", dataType:'jsonp', type:"GET", success:function(data) { alert("Data from Server"+JSON.stringify(data)); }, error:function(jqXHR,textStatus,errorThrown) { alert("You can not send Cross Domain AJAX requests : "+errorThrown); } }); 

如何编写jsonp代码来读取此URL ?

对于JSONP,将dataType:'json'dataType:'jsonp' 。 此外,您的服务器需要了解JSONP。 一个真正的JSONP感知Web服务将读入强制性的?callback=? 您的url的参数。

以下是适当的JSONP响应: http ://ip.jsontest.com/?callback= methodName with response:

 methodName({"ip": "151.194.190.31"}); 

解决方案1 ​​ – 带回调的JSONP

找出该URL是否支持JSONP和回调名称。 如果是这样,请使用回调参数并使用JSONP。 没有CORS问题。 这是一个小提琴样本。

更多信息: 即使响应是json,jquery + jsonp也会返回语法错误

解决方案2 – 允许CORS并使用普通JSON

Access-Control-Allow-Origin: *到该URL的响应中(如果可以控制),并将其作为JSON响应(而不是JSONP)进行处理。

解决方案3 – DIY JSONP包装器

如果该URL不支持JSONP,并且它不允许CORS,那么您可以通过使用一些服务器端代码来刮取该URL的JSON结果,然后将JSON包装在回调函数中,将标头设置为Access-Control-Allow-Origin: * ,并将结果返回给您的AJAX JSONP脚本。 挺整洁的,对吧?

哦,你走了:

  

解决方案4 – JSONP代理服务

如果您只需要立即使用,您可以使用在线JSONP代理服务,例如Yahoo的YQL服务 。 然后,使用没有JSONP且没有CORS的URL,您可以:

 var theUrl = "http://ec.europa.eu/semantic_webgate/query/sparql?dataset=rasff&format=json&limit=10&query=select%20?p%20where%20%20%7B%20?s%20?p%20?o%20%7D"; var yql = 'http://query.yahooapis.com/v1/public/yql?' + 'q=' + encodeURIComponent('select * from json where url=@url') + '&url=' + encodeURIComponent(theUrl) + '&format=json&callback=?'; $.getJSON(yql, function (data) { alert(JSON.stringify(data)); } ); 

演示: http : //jsfiddle.net/L4foze7t/