jquery - 测试静态 jsonp 响应

标签 jquery jsonp

我在发出 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 等 api 时该请求有效。但是,我正在尝试设置一个页面来发送响应。在我的示例中,我只有一个带有硬编码 jsonp 的空白页面。我不确定页面上是否必须有其他标题或在我的服务器上启用某些内容。

最佳答案

响应错误。

如果您有以下网址: http://www.mydomain.com/test/jsonp.php&callback=? jQuery 将用唯一的字符串替换 url 末尾的问号。在服务器端,您必须获取此字符串($_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 创建一个 <script> 元素: http://www.mydomain.com/test/jsonp.php&callback=fx123456 。 jQuery 将调用一个名为 fx123456() 的动态创建函数。该函数将返回 JSON(作为对象),该 JSON 将作为 $.ajax() 成功函数的数据参数。

因此,如果您不使用 jQuery 提供的回调参数作为响应中的函数名称,则 jQuery 不知道要调用的函数的名称(我最好说 jQuery 将调用一个不存在的函数) )。

关于jquery - 测试静态 jsonp 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4373419/

相关文章:

javascript - 在 html 页面中的 2 个元素之间画线

javascript - 滑动js自定义宽度

angularjs - 返回 JSON_CALLBACK 的 Angular JSONP 未定义错误

php - JSONP 与 Laravel

jquery - 向 jQuery 添加事件

jquery - 过滤jquery中的对象

javascript - 如何在页面刷新时中止ajax请求

asp.net - 使用 AJAX 从 ASPX 站点检索 XML 数据

javascript - 如何在 jsonp 调用上接收有关 404,409 和其他服务器错误的通知

json - ASP.net MVC 返回 JSONP