如何使用JSONP以及如何制作支持JSONP输出的REST Web服务?

4

我有一个项目,要使用Jquery Mobile制作移动Web应用程序。我希望我的应用程序能够消耗来自跨域REST Web服务的数据。许多人说要使用JSONP。但我仍然不清楚如何使用它以及如何构建支持JSONP输出的REST Web服务。是否有人可以帮助我解释一下JSONP的工作原理?或者有没有这种情况的示例代码?谢谢。


你想用哪个框架/技术来构建REST服务? - TheWhiteRabbit
2个回答

2

JSONP是客户端请求,而REST服务则是服务器端请求(仅适用于跨域API服务)。它们在处理过程方面有所不同。

JSONP:

您可以使用javascript或jquery ajax方法实现JSONP。使用jquery实现是最简单的方式。JSONP是一种类型,可以动态地将javascript脚本包含在您的html文档中。因此,您可以动态调用js函数。

有很多资源可用于JSONP实现。我推荐下面这个链接:

查看此处以获取JSONP实现

下面是一个简单的jquery ajax函数,它触发了对经度和纬度的jsonp请求。

$.ajax({
        type: "GET",
        dataType: "jsonp",
        cache: false,
        url: 'http://api.ipinfodb.com/v3/ip-city/?key=b518527dd751af36c974e0adcdc4cb329917df46c006a72bf92858dd7c059488&ip=<?=$client_ip?>&format=json',
        success: function(data) {           
            alert(data.latitude+":"+data.longitude)                             
        },
        error: function(){
            alert('Could not able to find location!');
        }
    });

请查看此文章了解REST实现。

希望这能对您有所帮助。


注意:错误函数处理程序不会被跨域请求或跨域jsonp调用调用。 - NovumCoder

0

关于何为RESTful Web服务,目前还没有统一的标准。定义可能包括以下内容: - API URL路径反映对象模型,例如user/43/comment/?datetime=01022013 - HTTP动词反映更改的性质,例如GET不应该写入数据等。 - HTTP响应代码映射到响应状态,例如仅在没有错误时返回200 OK

JSONP是一种跨域请求的方式,可以避免浏览器上的CORS安全问题。虽然JS框架可能会将现实抽象化,但在幕后,JSONP会将一个<script>标签插入页面的DOM中。JSONP URL标准地包括一个查询参数callback=<<nameForCallback>>。响应以JavaScript形式呈现,格式如下:nameForCallback({ error: false, myData: "banana"});

JSONP始终使用GET作为其HTTP动词。API应该始终返回2XX状态码,即使出现错误,因为否则浏览器将忽略响应有效载荷(它们将无法被您的JavaScript代码访问)。

这些事实排除了许多被认为是RESTful服务的API设计方面。如果你绝对必须使用JSONP(解决CORS问题不可能),你仍然可以将一些有益于API设计的RESTful特性纳入其中,例如反映数据模型的路径路由等。


很好的解释,但它并没有回答原始问题——即如何编写代码。 - belwood
同意,我想指出JSONP和RESTful并不完全兼容。本周我在解决尝试在JSONP端点上返回RESTful状态码的问题,花了一天时间才意识到由于JSONP的性质,它根本行不通,所以我的答案部分是希望能够为其他人节省同样的痛苦。 :) - grapefinch
我明白你的意思。 - belwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接