具有远程URL的JSONP不起作用



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

我还试图通过编写xhrFields: { withCredentials: true }, crossDomain: true,Access-Control-Allow-Credentials: 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服务将读取URL的强制?callback=?参数。

以下是正确的JSONP响应:http://ip.jsontest.com/?callback=methodName响应:

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

解决方案1-带回调的JSONP

了解该URL是否支持JSONP和回调名称。如果是,请使用回调参数并使用JSONP。没有CORS问题。这是Fiddle的样品。

更多信息:即使响应为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脚本来进行欺骗。很整洁,是吗?

哦,给你:

<?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的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/

最新更新