Ajax學習(6)---服務器端腳本和程序中用 JSON 進行響應和回覆

JSON 是適用於 Ajax 應用程序的一種有效格式,原因是它使 JavaScript 對象和字符串值之間得以快速轉換。由於 Ajax 應用程序非常適合將純文本發送給服務器端程序並對應地接收純文本,相比不能生成文本的 API,能生成文本的 API 自然更可取;而且,JSON 讓您能夠處理本地 JavaScript 對象,而無需爲如何表示這些對象多費心思。
XML 也可以提供文本方面的類似益處,但用於將 JavaScript 對象轉換成 XML 的幾個現有 API 沒有 JSON API 成熟;有時,您必須在創建和處理 JavaScript 對象時格外謹慎以確保所進行的處理能與所選用的 XML 會話 API 協作。但對於 JSON,情況就大不相同:它能處理幾乎所有可能的對象類型,並會返回給您一個非常好的 JSON 數據表示。
因此,JSON 的最大價值在於可以將 JavaScript 真的作爲 JavaScript 而非數據格式語言進行處理。您所學到的所有有關使用 JavaScript 對象的技巧都可以應用到代碼中,而無需爲如何將這些對象轉變成文本而多費心思。這之後,可以進行如下所示的簡單 JSON 方法調用:

String myObjectInJSON = myObject.toJSONString();

現在就可以將結果文本發送給服務器了。


*將 JSON 發給服務器
----通過 GET 以名稱/值對發送 JSON

將 JSON 數據發給服務器的最簡單方法是將其轉換成文本,然後以名稱/值對的值的方式進行發送。請務必注意,JSON 格式的數據是相當長的一個對象,看起來可能會如清單 1 所示:
清單 1. JSON 格式的簡單 JavaScript 對象

var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin",
"email": "[email protected]" }, { "firstName": "Jason", "lastName":"Hunter",
"email": "[email protected]" }, { "firstName": "Elliotte", "lastName":"Harold",
"email": "[email protected]" } ], "authors": [ { "firstName": "Isaac",
"lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad",
"lastName": "Williams", "genre": "fantasy" }, { "firstName": "Frank",
"lastName": "Peretti", "genre": "christian fiction" } ], "musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } ] }

如果要以名稱/值對將其發送到服務器端,應該如下所示:

var url = "organizePeople.aspx?people=" + people.toJSONString();
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = updatePage;
xmlHttp.send(null);

存在一個問題:在 JSON 數據中會有空格和各種字符,Web 瀏覽器往往要嘗試對其繼續編譯。要確保這些字符不會在服務器上(或者在將數據發送給服務器的過程中)引起混亂,需要在 JavaScript escape() 函數中做如下添加:

var url = "organizePeople.aspx?people=" + escape(people.toJSONString());
request.open("GET", url, true);
request.onreadystatechange = updatePage;
request.send(null);

該函數可以處理空格、斜線和其他任何可能影響瀏覽器的內容,並將它們轉換成 Web 可用字符(比如,空格會被轉換成 %20,瀏覽器並不會將其視爲空格處理,而是不做更改,將其直接傳遞到服務器)。之後,服務器會(通常自動)再把它們轉換回它們傳輸後的本來 “面目”。

這種做法的缺點有兩個:
在使用 GET 請求發送大塊數據時,對 URL 字符串有長度限制。雖然這個限制很寬泛,但對象的 JSON 字符串表示的長度可能超出您的想象,尤其是在使用極其複雜的對象時更是如此。
在跨網絡以純文本發送所有數據的時候,發送數據面臨的不安全性超出了您的處理能力。
簡言之,以上是 GET 請求的兩個限制,而不是簡單的兩個與 JSON 數據相關的事情。在想要發送用戶名和姓之外的更多內容,比如表單中的選擇時,二者可能會需要多加註意。若要處理任何機密或極長的內容,可以使用 POST 請求。

----利用 POST 請求發送 JSON 數據

當決定使用 POST 請求將 JSON 數據發送給服務器時,並不需要對代碼進行大量更改,如下所示:

var url = "organizePeople.php?timeStamp=" + new Date().getTime();
request.open("POST", url, true);
request.onreadystatechange = updatePage;
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send(people.toJSONString());

使用 POST 而非 GET 打開,Content-Type 頭被設置爲讓服務器預知它能得到何種數據。在這種情況下,即爲 application/x-www-form-urlencoded,它讓服務器知道現在發送的是文本,正如它從常規的 HTML 表單中得到的一樣。
另一個簡單提示是 URL 的末尾追加了時間。這就確保了請求不會在它第一次被髮送後即緩存,而是會在此方法每次被調用後重新創建和重發;此 URL 會由於時間戳的不同而稍微有些不同。這種技巧常被用於確保到腳本的 POST 每次都會實際生成新請求且 Web 服務器不會嘗試緩存來自服務器的響應。

*在服務器上解釋 JSON
處理 JSON 的兩步驟:
針對編寫服務器端程序所用的語言,找到相應的 JSON 解析器/工具箱/幫助器 API。
使用 JSON 解析器/工具箱/幫助器 API 取得來自客戶機的請求數據並將數據轉變成腳本能理解的東西。

尋找 JSON 解析器或工具箱最好的資源是 JSON 站點(有關鏈接,請參閱參考資料)。在這裏,除了可以瞭解此格式本身的方方面面之外,還可以通過各種鏈接找到 JSON 的各種工具和解析器,從 ASP 到 Erlang,到 Pike,再到 Ruby,應有盡有。您只需針對自己編寫腳本所用的語言下載相應的工具箱即可。爲了讓服務器端腳本和程序能夠使用此工具箱,可以根據情況對其進行選擇、擴展或安裝(如果在服務器端使用的是 C#、PHP 或 Lisp,則可變性更大)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章