目前我正在开发一个 jQuery Mobile 网站,该网站稍后将通过 Titanium 转换为一个应用程序。我创建了一个 RESTful JSON Web 服务,它运行在与 jQuery Mobile 应用程序不同的服务器上。 Web 服务使用 JSONP 通过 AJAX 使用。
我觉得烦人的一件事是我不能使用 HTTP 错误代码,因为只要服务器发出错误,jQuery 就会自动中止 JSONP 调用。我永远无法掌握客户端的错误代码。
另一件事是 JSONP 仅适用于 HTTP 动词 GET,例如您不能发出 JSONP POST(目前,Web 服务仅是 GET,但这可能会改变)。
有没有 JSONP 的替代品?还是在将远程 JSON Web 服务与 AJAX 结合使用时,JSONP 是我唯一的选择?例如,Twitter 应用程序如何与 Twitter API(它们具有 REST API)交互?
最佳答案
你的问题很好地说明了为什么人们提示 jquery 太容易采用;)
JSONP 不是 ajax。没有成功和失败回调。 JSONP 是这样的:
- 将参数放在url中
- 添加&jsoncallback=random2745273
- 创建一个全局变量
random2745273
并将回调引用放入其中 - 添加
<script src="theurlhere"></script>
到head
- 这就是你所能做的。
服务器返回
random2745273({somedata});
这就是调用回调的方式。
如果您想报告错误,那么您的服务器必须生成正确的代码。您不会知道发送了哪些 HTTP header 。
这是您可以与 api 进行跨域通信的唯一方式。 生成 iframe 也可以发送跨域通信,但它很老套而且很少使用。
[编辑]
好吧,这让我开始思考......我可以使用 iframe hack 来包装 JSONP!
和往常一样 - 我不是第一个有这个想法的人(我终于谦虚地用谷歌搜索了我的想法;))
这是:http://beebole.com/en/blog/general/sandbox-your-cross-domain-jsonp-to-improve-mashup-security/
太棒了
[编辑2]
哇哦,我忘了...还有一个。
window.postMessage
它已经在一些浏览器中实现了。如果您不必兼容大多数浏览器,您现在就可以开始使用它了! :)
关于http - jQuery Mobile App + 远程 REST Web 服务 : Alternatives to JSONP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6357730/