有一段JavaScript如下:
代碼
- var obj = {
- prop1: "a0~`!@#$%^&*()-_+={}[]|\\:;\"',.?/",
- prop2: ['x','y'],
- prop3: {
- nestedProp1: 'abc',
- nestedProp2: 456
- }
- }
本文將會討論如何把一個(gè)對象轉(zhuǎn)換為JSON并將其發(fā)送到服務(wù)器。
編輯 使用Ext.urlEncode進(jìn)行URL編碼
首先我們看看Ext.urlEncode 這個(gè)方法(相對應(yīng)的是Ext.urlDecode解碼方法)。 Ext.urlEncode()不能用來處理JSON,Ext.urlEncode()只是負(fù)責(zé)在HTTP進(jìn)行GET、POST請求時(shí),將某個(gè)“普通的” 對象轉(zhuǎn)換成名稱/值(name/value)的狀態(tài)。我這里說“普通”的意思是urlEncode只是將第一層屬性編碼,———數(shù)組自然沒有問題但內(nèi)嵌的對象就不行了。 舉例:
代碼
- Ext.urlEncode(obj) == "prop1=a0~%60!%40%23%24%25%5E%26*()-_%2B%3D%7B%7D%5B%5D%7C%5C%3A%3B%22'%2C.%3F%2F&prop2=x&prop2=y"
* 注意屬性3被忽略了
* 注意特殊字符都被編碼了(使用JS自身的encodeURIComponent())
如果你只是想純粹地發(fā)送一些的請求,可把參數(shù)寫成JavaScript原生對象的形式,然后用這個(gè)方法編碼urlEncode發(fā)送,———這是較方便的做法。
例如,你可以在一個(gè)GET請求的URL后面加上一段文本字符:
* 請求是這樣的:
代碼
* 服務(wù)器會透過URIComponent解碼成為:
代碼
- prop1 a0~`!@#$%^&*()-_+={}[]|\:;"',.?/
- prop2 x
- prop2 y
你也可以同POST請求發(fā)送這樣的內(nèi)容:
* 請求是這樣的:
代碼
* POST內(nèi)容:
代碼
- prop1=a0~%60!%40%23%24%25%5E%26*()-_%2B%3D%7B%7D%5B%5D%7C%5C%3A%3B%22'%2C.%3F%2F&prop2=x&prop2=y
* 服務(wù)器得到的結(jié)果是和GET請求的內(nèi)容無異的。
這一切還順利,但說到要發(fā)送和接受JSON,該怎么辦呢?接下來再看!
編輯 使用Ext.encode編碼JSON
Ext.encode() (其對應(yīng)的解碼方法為Ext.decode)轉(zhuǎn)換一個(gè)復(fù)制的對象為一段JSON字符舉例:
代碼
- Ext.encode(obj) == '{"prop1":"a0~`!@#$%^&*()-_+={}[]|\\:;\"\',.?/","prop2":["x","y"],"prop3":{"nestedProp1":"abc","nestedProp2":456}}'
* 注意內(nèi)嵌對象的屬性現(xiàn)在被包含進(jìn)去了
剛才是我們轉(zhuǎn)換一個(gè)簡單的對象到名稱/值(name/value)的狀態(tài),現(xiàn)在的情況將有所不同,此時(shí)的對象已經(jīng)被轉(zhuǎn)換到(序列化)一段參數(shù)。具體的作用是,以名稱/值(name/value)的形式,發(fā)送到服務(wù)器解析。如果只是發(fā)送一個(gè)JSON字符串,可認(rèn)為這個(gè)就是json參數(shù)。
要將JSON轉(zhuǎn)換成為可GET/POST適合發(fā)送的名稱/值(name/value)狀態(tài),你可以額外地將其編碼:
代碼
- encodeURIComponent(Ext.encode(obj)) == "%7B%22prop1%22%3A%22a0~%60!%40%23%24%25%5E%26*()-_%2B%3D%7B%7D%5B%5D%7C%5C%5C%3A%3B%5C%22'%2C.%3F%2F%22%2C%22prop2%22%3A%5B%22x%22%2C%22y%22%5D%2C%22prop3%22%3A%7B%22nestedProp1%22%3A%22abc%22%2C%22nestedProp2%22%3A456%7D%7D"
創(chuàng)建一個(gè)GET的請求如下:
代碼
- "http://url.com?json=" + encodeURIComponent(Ext.encode(obj))
或是POST請求也行:
代碼
- "json=" + encodeURIComponent(Ext.encode(obj))
urlEncode()方法也是可以:
代碼
- Ext.urlEncode({ json: Ext.encode(obj)}) == "json=%7B%22prop1%22%3A%22a0~%60!%40%23%24%25%5E%26*()-_%2B%3D%7B%7D%5B%5D%7C%5C%5C%3A%3B%5C%22'%2C.%3F%2F%22%2C%22prop2%22%3A%5B%22x%22%2C%22y%22%5D%2C%22prop3%22%3A%7B%22nestedProp1%22%3A%22abc%22%2C%22nestedProp2%22%3A456%7D%7D"
這樣便可以通過GET/POST發(fā)送。至于另一邊的服務(wù)端,會透過URIComponent解碼這段參數(shù):
代碼
- {"prop1":"a0~`!@#$%^&*()-_+={}[]|\\:;\"',.?/","prop2":["x","y"],"prop3":{"nestedProp1":"abc","nestedProp2":456}}
來訪問JSON已解碼的數(shù)據(jù)。
編輯 使用Ext.Ajax.request發(fā)送JSON
在EXT 1.1,你可以輕松地使用Ext.Ajax.request()方法來創(chuàng)建一個(gè)典型AJAX的請求。該方法允許傳入一個(gè)配置項(xiàng)的對象,即是可包含其它類型的內(nèi)容,作為請求的參數(shù)的用途,下面引用API的介紹:
(原文)params {Object/String/Function} (Optional) An object containing properties which are used as parameters to the request, a url encoded string or a function to call to get either.
(中文)params {Object/String/Function} (可選項(xiàng)) 包含請求參數(shù)的對象,以對象的屬性形式出現(xiàn),一段可url編碼的字符串,或者是可返回以上兩者的函數(shù)。
對于傳入的是object類型, Ext.Ajax.request會調(diào)用Ext.urlEncode()將其轉(zhuǎn)換為名稱/值(name/value)的狀態(tài)(通常情況忽略內(nèi)嵌的對象)。
代碼
- var req = Ext.Ajax.request({
- url: "/ws/search.pl",
- params: obj,
- method: 'GET',
- disableCaching: false
- })
請求是這樣的:
代碼
- /ws/search.pl?prop1=a0~%60!%40%23%24%25%5E%26*()-_%2B%3D%7B%7D%5B%5D%7C%5C%3A%3B%22'%2C.%3F%2F&prop2=x&prop2=y
服務(wù)端解析為:
代碼
- prop1 a0~`!@#$%^&*()-_+={}[]|\:;"',.?/
- prop2 x
- prop2 y
* 如不禁止disableCaching,Ext會加上唯一的_dc參數(shù)以消除緩沖。
* 每次送出的數(shù)據(jù)都是經(jīng)過Ext.urlEncode(),很明顯是沒有發(fā)送完整的JSON,只是一連串的名稱/值(name/value)的狀態(tài)。
如果使用POST的方法,過程也是相同,區(qū)別是名稱/值(name/value)的狀態(tài)是放在POST BOBY內(nèi)發(fā)送。
要把JSON發(fā)送到服務(wù)器,我們需要使用Ext.encode()方法轉(zhuǎn)換數(shù)據(jù)對象到文本格式的JSON。 Ext.Ajax.request()允許傳入一段可URL編碼的字符串,所以你既可以用 encodeURIComponent()編碼參數(shù),亦可直接是一個(gè)簡單的對象,讓Ext.Ajax.request()為你編碼:
代碼
- var req = Ext.Ajax.request({
- url: "/ws/search.pl",
- params: {json: Ext.encode(obj)},
- disableCaching: false
- })
相類似地,服務(wù)端會解析為:
代碼
- {"prop1":"a0~`!@#$%^&*()-_+={}[]|\\:;\"',.?/","prop2":["x","y"],"prop3":{"nestedProp1":"abc","nestedProp2":456}}
這樣我們便可以訪問JSON已解碼的數(shù)據(jù)了。