2011-05-26 74 views
27

如何查看Google Web Toolkits(GWT)RPC調用的數據格式以及如何傳輸IsSerializable對象。我知道Java Serializable傳輸某種二進制格式,但GWT也是如此嗎? (因爲我不指望它與JavaScript兼容,或者至少需要一些額外的解析)。GWT RPC數據格式

回答

48

編輯:布賴恩Slesinsky剛剛記錄的協議(通過逆向工程的代碼):https://docs.google.com/document/d/1eG0YocsYYbNAtivkLtcaiEE5IOF5u4LUol8-LL0TIKU/edit

首先,GWT-RPC協議是不對稱的,使得它的客戶端總是優化:快速反序列化來自服務器的東西,並快速序列化一些東西發送給它。

這顯然不是二進制的,正如您懷疑的那樣,但是基於文本。客戶端到服務器協議以管道分隔,而服務器到客戶端基於JSON(前綴爲//OK//EX,以告知請求是成功還是失敗)。兩者都使用可序列化類的常見知識來序列化/反序列化;例如,雙方都知道類X有兩個字段,即一個整數和一個字符串,按順序序列化,因此它們都寫/讀一個整數,然後是一個字符串,而不需要以編碼格式指定它是哪個字段關於。

GWT-RPC協議版本化(它隨着新的GWT版本的發佈而定期更新),並使用類和可序列化字段名稱的哈希來確保客戶端和服務器都使用相同版本的類(這意味着每次更改可序列化類時,都必須重新編譯並重新部署客戶端代碼)。

最好的文檔是代碼,但你會發現在這些幻燈片的請求格式的概述:https://www.owasp.org/images/7/77/Attacking_Google_Web_Toolkit.ppt

RequestFactory,違背GWT-RPC,採用的是對稱的基於JSON的協議(基於AutoBean的JSON序列化),即使沒有從相同的代碼編譯(當然,取決於你在版本之間做出的改變),客戶端和服務器也可以進行通信,因爲它們傳遞了類名和屬性名。

+1

偉大的答案,順便說一句,你知道任何沒有Java實現GWT_RPCs? – Stefan 2011-05-26 12:26:47

+0

Google向我介紹有關http://code.google.com/p/gwtphp/和http://code.google.com/p/python-gwt-rpc/的內容,但它們看起來已被放棄(並且RequestFactory是要走的路,但我不知道任何非Java實現) – 2011-05-26 19:03:16

+0

再次感謝。根據這一點,當我想談談沒有Java服務器RPC是不是要走的路,我應該一些自定義的JSON或XML協議。 – Stefan 2011-05-27 06:51:41