<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    菠蘿三國

    大江東去,浪淘盡...
    隨筆 - 34, 文章 - 47, 評論 - 22, 引用 - 0
    數(shù)據(jù)加載中……

    EXT手冊:Manual:Core:Working with JSON (Chinese) (轉(zhuǎn))

    有一段JavaScript如下:

    代碼
    1. var obj = {   
    2.     prop1: "a0~`!@#$%^&*()-_+={}[]|\\:;\"',.?/",   
    3.     prop2: ['x','y'],   
    4.     prop3: {   
    5.         nestedProp1: 'abc',    
    6.         nestedProp2: 456  
    7.     }   
    8. }  

     

    本文將會討論如何把一個(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)嵌的對象就不行了。 舉例:

    代碼
    1. 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后面加上一段文本字符:

    * 請求是這樣的:

    代碼
    1. http://myurl.com?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ù)器會透過URIComponent解碼成為:

     

    代碼
    1. prop1   a0~`!@#$%^&*()-_+={}[]|\:;"',.?/   
    2. prop2   x   
    3. prop2   y  

     

    你也可以同POST請求發(fā)送這樣的內(nèi)容:

    * 請求是這樣的:

    代碼
    1. http://myurl.com  

     

    * POST內(nèi)容:

    代碼
    1. 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字符舉例:

    代碼
    1. 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),你可以額外地將其編碼:

    代碼
    1. 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的請求如下:
    代碼
    1. "http://url.com?json=" + encodeURIComponent(Ext.encode(obj))   

    或是POST請求也行:

     

    代碼
    1. "json=" + encodeURIComponent(Ext.encode(obj))  

     

    urlEncode()方法也是可以:

    代碼
    1. 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ù):

     

    代碼
    1. {"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)嵌的對象)。

    代碼
    1. var req = Ext.Ajax.request({   
    2.     url: "/ws/search.pl",   
    3.     params: obj,   
    4.     method: 'GET',   
    5.     disableCaching: false  
    6. })  

     

    請求是這樣的:

    代碼
    1. /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ù)端解析為:

     

    代碼
    1. prop1   a0~`!@#$%^&*()-_+={}[]|\:;"',.?/   
    2. prop2   x   
    3. 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()為你編碼:

    代碼
    1. var req = Ext.Ajax.request({   
    2.     url: "/ws/search.pl",   
    3.     params: {json: Ext.encode(obj)},   
    4.     disableCaching: false  
    5. })  

     

    相類似地,服務(wù)端會解析為:

    代碼
    1. {"prop1":"a0~`!@#$%^&*()-_+={}[]|\\:;\"',.?/","prop2":["x","y"],"prop3":{"nestedProp1":"abc","nestedProp2":456}}  

     

    這樣我們便可以訪問JSON已解碼的數(shù)據(jù)了。

    posted on 2007-11-12 22:20 菠蘿 閱讀(865) 評論(0)  編輯  收藏 所屬分類: EXT

    主站蜘蛛池模板: 精品一区二区三区免费视频| 亚洲av色香蕉一区二区三区蜜桃| 一级做a爱片特黄在线观看免费看| 国产一卡2卡3卡4卡无卡免费视频| 在线观看亚洲一区二区| 99久久久国产精品免费牛牛| 亚洲最大福利视频网站| 久久精品毛片免费观看| 亚洲成av人片不卡无码| 中文字幕乱码免费视频| 亚洲国产日韩精品| 成人免费视频网址| 美女无遮挡免费视频网站| 亚洲精品专区在线观看| 在线观看免费无码视频| 亚洲精品私拍国产福利在线| 18未年禁止免费观看| 亚洲人成网站色在线观看| 免费无码又爽又刺激高潮的视频| 亚洲va中文字幕| 久久亚洲国产成人精品无码区| 中文字幕不卡免费视频| 亚洲码在线中文在线观看| 久久不见久久见中文字幕免费| 色综合久久精品亚洲国产| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲国产日韩在线观频| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 最近的2019免费中文字幕| 久久亚洲精品无码AV红樱桃| 免费看美女裸露无档网站| 亚洲AV无码专区国产乱码不卡| 亚洲熟妇少妇任你躁在线观看无码| 99视频在线观看免费| 亚洲一区二区影视| 亚洲国产精品无码久久久久久曰| 国产啪精品视频网站免费尤物 | 亚洲日韩国产一区二区三区在线 | 美女裸免费观看网站| 亚洲V无码一区二区三区四区观看| 日韩在线免费视频|