Ajax學習(6)—伺服器端指令碼和程式中用 JSON 進行響應和回複

來源:互聯網
上載者:User

 

  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": "brett@newInstance.com" },    { "firstName": "Jason", "lastName":"Hunter",
"email": "jason@servlets.com" },    { "firstName": "Elliotte", "lastName":"Harold",
"email": "elharo@macfaq.com" }   ],  "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 資料中會有空格和各種字元,網頁瀏覽器往往要嘗試對其繼續編譯。要確保這些字元不會在伺服器上(或者在將資料發送給伺服器的過程中)引起混亂,需要在 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,則可變性更大)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.