編碼請求主體

編碼請求主體
HTTP的POST請求包括一個請求主體,將會包含客戶端傳遞給服務(wù)器的數(shù)據(jù)律想,

表單編碼的請求

HTML表單猎莲,當(dāng)用戶提交表單時,表單中的數(shù)據(jù)將會編碼到字符串中技即,一并伴隨著請求發(fā)送著洼。
默認(rèn)情況下HTML表單通過POST方法發(fā)送給服務(wù)器,而編碼后的表單數(shù)據(jù)為請求主體而叼。

規(guī)則:使用URL編碼身笤,使用等號把編碼后的名字和值分開,并使用&符號將名/值對分開葵陵。

如下所示: find=pizza&zipcode=02134&redius=1km

表單數(shù)據(jù)編碼格式會有一個正式的MIME類型

application/x-www-form-urlencoded

MIME 多用途internet郵件擴展類型,對大小寫不敏感液荸,傳統(tǒng)寫法小寫

一個栗子

用于HTTP請求的編碼對象

/*
 *  編碼對象的屬性
 *  如果它們是來自HTML表單的名/值對,使用application/x-www-form-urlencolded
 *  將鍵值對轉(zhuǎn)換為HTTP的編碼方式的一個工具函數(shù)
 */

function encodeFormData(data) {
    if (!data) return '';   // 如果傳入為空莹弊,直接返回字符串
    var pairs = []; // 保存名/值對
    for(var name in data) { // 進行遍歷
        if (!data.hasOwnProperty(name)) continue;   // 跳過繼承屬性,指示自身的屬性是否具有該值
        if (typeof data[name] === 'function') continue; // 跳過方法
        var value = data[name].toString();  // 將值轉(zhuǎn)換成字符串
        name = encodeURIComponent(name.replace('%20', '+'));    
        value = encodeURIComponent(value.replace('%20', '+'));
        pairs.push(name + '=' + value); // 記住名值對
    }

    return pairs.join('&'); // 進行連接
}

上方代碼將傳入的鍵值對响迂,轉(zhuǎn)換為url的方式提交

function postData(url, data, callback) {
    var request = new XMLHttpRequest(); // 新建一個類
    request.open("post", url);
    request.onreadystatechange = () => {
        if (request.readyState === 4 && callback) {
            callback(request);  // 調(diào)用回調(diào)函數(shù)
        };
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        
    }
    request.send(encodeFormData(data));
}

上方的代碼將會發(fā)送一個post請求川梅,將鍵值對轉(zhuǎn)換為標(biāo)準(zhǔn)的url進行提交

var e = {e:2222220};
postData('./', e);

查看一下post請求結(jié)果


此處輸入圖片的描述
此處輸入圖片的描述

同樣的get請求

function getData(url, data, callback) {
    var request = new XMLHttpRequest();
    request.open('GET', url + '?' + encodeFormData(data));
    request.onreadystatechange = () => {
        if (request.readyState === 4 && callback) {
            callback(request);
        }
    }
    request.send(null);
}

效果如下


此處輸入圖片的描述
此處輸入圖片的描述

JSON編碼

需要在將其更改為

application/json

即可以進行表單提交

function postJSON(url, data, callback) {
    var request = new XMLHttpRequest();
    request.open('post', url);
    request.onreadystatechange = () => {
        if (request.readystate === 4 && callback) {
            callback(request);
        };
    }
    request.setRequestHeader('Content-Type', 'application/json');
    request.send(JSON.stringify(data))
}

演示如下

psotJSON('./', e);
此處輸入圖片的描述
此處輸入圖片的描述

XML編碼請求

xml文檔作為主體的HTTP POST請求

function postQuery(url, what, where, radius, callback) {
    var request = new XMLHttpRequest(); 
    request.open('post', url);  // 對指定的url發(fā)送POST請求
    request.onreadystatechange = () => {
        if (request.readyState === 4 && callback) callback(request);
    }

    // 下面開始使用XML
    var doc = document.implementation.createDocument('', 'query', null);    // document.implementaton 返回一個DOMImplementation對象,該對象和當(dāng)前文檔的節(jié)點沒有任何關(guān)系(類似于一個虛擬節(jié)點)其根節(jié)點為qqery 并且沒有聲明
    var query = doc.documentElement;    // 返回文檔的根元素
    var find = doc.createElement('find');   // 創(chuàng)建一個find元素
    query.appendChild(find);    // 讓find成為query的子節(jié)點
    find.setAttribute('zipcode', where);    // 創(chuàng)建一個屬性
    find.setAttribute('radius', radius);    
    find.appendChild(doc.createTextNode(what)); // what作為文本節(jié)點丢早,并且設(shè)置為find的子節(jié)點

    // 現(xiàn)在向服務(wù)器發(fā)送XML編碼的數(shù)據(jù)
    // 將會自動設(shè)置Content-Type頭
    request.send(doc);
};

查看結(jié)果

postQuery('./', 'hello', 'world', 'world');

打開網(wǎng)絡(luò)面板查看


此處輸入圖片的描述
此處輸入圖片的描述

multipart/from-data 請求

當(dāng)HTML表單包含文件上傳元素的時候怨酝,表單需要使用二進制上傳,即

multipart/form-data

使用post方法發(fā)送multipart/form-data請求主體

XHR 為一種簡稱斤葱,全稱為XMLHttpRequest

將會以一個字節(jié)一個字節(jié)發(fā)送

function postFormData(url, data, callback) {
    if (typeof FormData === 'undefined') {  // 兼容料身,判斷該api是否存在
        throw new Error('not FormData');
    }

    var request = new XMLHttpRequest();
    request.open('post', url);
    request.onreadystechange = () => {  // 當(dāng)響應(yīng)完成的時候,回調(diào)函數(shù)
        if (request.readyState === 4 && callback)
            callback(request);  // 如果存在鹤啡,則調(diào)用回調(diào)函數(shù)
    };
    var formdata = new FormData();  // 創(chuàng)建文件上傳的類
    for(var name in data) {
        if (!data.hasOwnProperty(name)) continue;   // 跳過繼承的屬性
        var value = data[name]; // 取值
        if (typeof value === 'function') continue;  // 跳過方法
        // 將其鍵值對插入節(jié)點中
        formdata.append(name, value);   // 添加鍵值對作為子節(jié)點
    }
    // 由于使用FormData將會自動設(shè)置頭部信息
    // 將鍵值對作為主體進行發(fā)送
    request.send(formdata);
}
postFormData('./', '11111111111111');
此處輸入圖片的描述
此處輸入圖片的描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抖部,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俯萎,更是在濱河造成了極大的恐慌夫啊,老刑警劉巖报嵌,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玄坦,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門哪轿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赤套,“玉大人飘痛,你說我怎么就攤上這事∪菸眨” “怎么了宣脉?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剔氏。 經(jīng)常有香客問我塑猖,道長,這世上最難降的妖魔是什么谈跛? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任羊苟,我火速辦了婚禮,結(jié)果婚禮上感憾,老公的妹妹穿的比我還像新娘践险。我一直安慰自己,他們只是感情好吹菱,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彭则,像睡著了一般鳍刷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俯抖,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天输瓜,我揣著相機與錄音,去河邊找鬼芬萍。 笑死尤揣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柬祠。 我是一名探鬼主播北戏,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漫蛔!你這毒婦竟也來了嗜愈?” 一聲冷哼從身側(cè)響起旧蛾,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蠕嫁,沒想到半個月后锨天,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡剃毒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年病袄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赘阀。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡益缠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纤壁,到底是詐尸還是另有隱情左刽,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布酌媒,位于F島的核電站欠痴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秒咨。R本人自食惡果不足惜喇辽,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雨席。 院中可真熱鬧菩咨,春花似錦、人聲如沸陡厘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糙置。三九已至云茸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谤饭,已是汗流浹背标捺。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揉抵,地道東北人亡容。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像冤今,于是被迫代替她去往敵國和親闺兢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容