带有远程URL的JSONP不起作用

时间:2015-04-12 13:18:32

标签: jquery json jsonp cors

在以下代码中,有一个以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代码来阅读this url

1 个答案:

答案 0 :(得分:4)

对于JSONP,请将dataType:'json'设置为dataType:'jsonp'。此外,您的服务器需要了解JSONP。真正支持JSONP的Web服务将读入您URL的强制?callback=?参数。

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

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

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

确定该URL是否支持JSONP和回调名称。如果是这样,请使用回调参数并使用JSONP。没有CORS问题。以下是Fiddle示例。

更多信息:jquery + jsonp return syntax error even when the response is json

解决方案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脚本。很整洁,呵呵?

哦,你走了:

<?php
// xss-service.php - Bare-bones demo by @Drakes
$callback = isset($_GET["callback"]) ? $_GET["callback"] : "?";

$json = file_get_contents('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');

header('Access-Control-Allow-Origin: *');
header("Content-type: application/json");
echo $callback . "(" . $json . ");";
?>

解决方案4 - JSONP代理服务

如果您只需要立即使用此功能,则可以使用在线JSONP代理服务,例如Yahoo's YQL service。然后,使用没有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/