使用XMLHttpRequest對WebForm發送POST Request的參數傳遞問題
一直以來使用AJAX都是採用jQuery的$.ajax()封裝,倒也沒啥問題,日前突然有一個需求需要轉回來採用Javascript原生的XMLHttpRequest,才發現沒有jQuery的日子有多難熬,連最基本的POST Parameter參數傳遞語法都已經失憶,記錄在此防止未來再度記憶揮發。
傳統上使用jQuery的AJAX傳遞方式如下:
var oData = {
cName: "John",
iMoney: 9999
};
$.ajax({
type: "POST",
url: "something.aspx",
data: oData,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
success: function(response) {
data = $.parseJSON(response);
alert(data.cMessage);
}
});
改回使用原生XMLHttpRequest的時候,經過確認後webform如果是採用Request.Form["XXX"]的採值方式,那麼你永遠只能使用「contentType: "application/x-www-form-urlencoded"」來對應。另外我一直習慣jQuery的寫法,對於XMLHttpRequest傳遞參數的data段直覺上我就給予JSON.stringify()去轉換帶出去
var oReq = new XMLHttpRequest();
oReq.send(JSON.stringify(oData));
以上面的程式碼來說,WebForm端點收到會呈現像這樣的像是被UrlEncode編碼過的字串「{%7b%22cName%22%3a%22John%22%2c%22iMoney%22%3a9999%7d}」,沒想到這樣的作法不僅無效,反而誤導自己陷入在編碼除錯的環節上(足足卡了半小時),事實上問題根本不再於此,直到受不了離開座位去上個廁所,才突然想到:阿幹!Request.Form是基於System.Web.HttpValueCollection,那就是Key-Value的結構啊,我一直傳JSON序列化過去幹嗎?返回將程式碼改為下列就解決了。
var oReq = new XMLHttpRequest();
oReq.open("POST", "something.aspx", true);
oReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
oReq.onload = function () {
var oReturn = $.parseJSON(oReq.response);
if (oReq.status == 200) {
alert(oReturn.cMessage);
} else {
alert(oReturn.cMessage);
}
};
oReq.send($.param(oData));
將oData參數包解回Key-Value的方式我還是採用jQuery的函式方法,因為我自己懶得寫,反正不要使用jQuery的AJAX送出POST就好了。