2011-06-15 86 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