我在制作jsonp请求时没有遇到任何问题,但是我不确定如何设置一个Web服务来在jsonp中提供响应。
首先,是否需要以某种方式配置服务器以允许jsonp请求,或者页面是否必须正确格式化响应?
在我的测试中,我从geonames.org获得了以下jsonp响应(我在服务器/域1上放置了一个空白页面,没有其他内容):
<?php echo $_GET['callback'];?>({"postalcodes":[{"adminName2":"Westchester","adminCode2":"119","postalcode":"10504","adminCode1":"NY","countryCode":"US","lng":-73.700942,"placeName":"Armonk","lat":41.136002,"adminName1":"New York"}]});
在服务器/域2上,我发出以下请求:
$.ajax({
// works when I make the call to geonames.org instead of domain1
//url: 'http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?',,
url: 'http://www.domain1.com/test/jsonp.php?callback=?',
success: function(data) {
$('#test').html(data);
},
});
当我将文件放在同一服务器(域1或2)上并将其转换为常规json请求时,调用有效。我做错了什么?
只是为了澄清:我的问题与收到请求的页面有关。当我将它发送到geonames.org,flickr等时,我知道请求有效... apis。但是,我正在尝试设置一个页面来发送响应。在我的例子中,我只有一个带有硬编码jsonp的空白页面。我不确定是否必须在页面上设置其他标题或在我的服务器上启用某些功能。
答案 0 :(得分:12)
回答错误。
如果您有以下网址: http://www.mydomain.com/test/jsonp.php&callback=? jQuery将使用唯一字符串替换网址末尾的问号。在服务器端,您必须使用此字符串( $ _ GET ['callback'] )并在响应中将其用作函数名称:
PHP-示例:
<?php
$object=array('postalcodes'
=>array(
array(
"adminName2" => "Westchester",
"adminCode2" => "119",
"postalcode" => "10504",
"adminCode1" => "NY",
"countryCode" => "US",
"lng" => -73.700942,
"placeName" => "Armonk",
"lat" => 41.136002,
"adminName1" => "New York"
)));
echo $_GET['callback'].'('.json_encode($object).')';
?>
收到回复后会发生什么? jQuery知道唯一的字符串(假设 fx123456 )
jQuery将使用src: http://www.mydomain.com/test/jsonp.php&callback=fx123456 创建一个<script>
- 元素。 jQuery将调用一个名为 fx123456()的动态创建函数。此函数将返回JSON(作为对象),该JSON将被视为 $。ajax()的成功函数的数据参数。
因此,如果你不使用jQuery提供的callback-parameter作为响应中的functions-name,jQuery不知道要调用的函数的名称(我更好的说jQuery会调用一个不存在的函数) )。
答案 1 :(得分:0)
我总是使用$.getJSON()代替$ .ajax进行跨浏览器请求,所以我不知道你在这里使用$ .ajax调用json的具体细节,但你是否尝试过设置dataType到jsonp?
另外,你试过吗?callback =?而不是&amp; callback =?
$.ajax({
url: 'http://www.mydomain.com/test/jsonp.php?callback=?',
dataType: 'jsonp',
success: function(data) {
$('#test').html(data);
},
});
最后,当我将测试json运行到jsonlint.com时,它不会返回有效状态。它说syntax error, unexpected TINVALID at line 1 Parsing failed