2011-06-15 84 views
1

目前我正在研究jQuery Mobile网站,该网站稍后将通过Titanium转换为应用程序。我创建了一个RESTful JSON Web服务,它运行在与jQuery Mobile应用程序不同的服务器上。 Web服务通过使用JSONP的AJAX消耗。jQuery Mobile App +远程REST Webservice:JSONP的替代方案?

我发现恼人的一件事是我无法使用HTTP错误代码,因为每当服务器发出错误时,jQuery都会自动中止JSONP调用。我永远无法掌握客户端的错误代码。另一件事是,JSONP只适用于HTTP动词GET,你不能发出JSONP POST例如(目前,Web服务仅仅是GET,但可以改变)。

有没有JSONP的替代品?或者JSONP是我在使用AJAX使用远程JSON Web服务时唯一的选择?例如,Twitter应用程序如何与Twitter API交互(它们具有REST API)?

+0

我不相信有,因为同源策略的局限性,许多替代JSONP。谷歌搜索发现[这篇文章](http://donatstudios.com/JSONP),它有一些为什么它存在的信息。这听起来像是jQuery如何为你打电话的主要问题;你有没有看过写/重写呼叫以传回状态码? – 2011-06-15 14:56:04

+0

感谢您的评论Paul DelRe。你的意思是覆盖jQuery的ajax()函数吗? – sustainablepace 2011-06-16 07:21:32

+0

我建议你看看如何在JavaScript中做到这一点或jQuery如何在JavaScript中做到这一点。我不会改变任何东西到你的jQuery代码副本中,因为这会让他们在发布新版本时很难保持最新状态。一旦你了解他们如何做到这一点,你可以编写自己的功能,但我相信它已经完成,所以谷歌首先(如naugtur)。 – 2011-06-16 13:27:23

回答

4

你的问题是一个很好的例子,为什么人们抱怨说,jQuery是太容易采纳;)

JSONP不阿贾克斯。没有成功和失败回调。 JSONP是这样的:

  1. 把参数中的URL
  2. 添加& jsoncallback = random2745273
  3. 创建一个全局变量random2745273,把回调引用它
  4. 添加<script src="theurlhere"></script>head
  5. 这就是你所能做的。

服务器返回

random2745273({somedata}); 

,这就是你的回调是如何被调用。

如果您想报告错误,那么您的服务器必须生成正确的代码。你不会知道发送了什么HTTP标头。

这是您可以使用api与跨域进行通信的唯一方法。 发送跨域通信也可以通过生成iframe来实现,但这很麻烦,很少使用。

[编辑]

好,这让我想...我可以使用的iframe劈死包裹在JSONP!

和往常一样 - 我是不是第一个有这个想法(我终于谦卑,以谷歌自己的想法想到它;))

这就是:http://beebole.com/en/blog/general/sandbox-your-cross-domain-jsonp-to-improve-mashup-security/

真棒

awww,我忘了......还有一个。

window.postMessage 

它已经在一些浏览器中实现。如果您不必与大多数浏览器兼容,现在就可以开始使用它! :)

+0

感谢您的详细回复。然而,我不明白这句话“如果你想报告错误,那么你的服务器必须生成一个正确的代码,你不会知道发送了什么HTTP头文件。”在我的情况下,服务器正在生成正确的代码,但仍然无法访问它。或者有没有办法访问错误代码? – sustainablepace 2011-06-16 14:06:54

+0

我重复 - NOOOO:P除非服务器的输出是对存在的函数的调用,否则不会在javascript中看到结果的踪迹。所以通过说'正确的代码'我的意思是像'random2745273({“error”:true});'在一个正确的HTTP 200响应的主体 – naugtur 2011-06-16 14:13:44

+0

感谢您解决这个问题。你推荐的解决方法是我已经实施的。感谢您的时间和奉献。 – sustainablepace 2011-06-16 14:54:21