- 首先請看下面的ajax封裝函數:
function ajaxset_new(posturl, postdata, successfunction) {
$.ajax({
// contentType: "application/json; charset=utf-8",
contentType: "application/x-www-form-urlencoded; charset=utf-8",
url: posturl,
type: 'POST',
dataType: 'json',
data: postdata,
cache: false,
async: false, //是否異步請求
success: successfunction,
complete: showdata,
statusCode: {
404: ajaxset_alert
},
error: errorHandling
});
}
第二個content-type是最老的最常用的——可以說讓我想起了做servlet的經驗漾稀。使用它可以達到自動解析postdata里面的參數值和對嫉柴,就像解析了get請求中的url里的參數值和對涩惑。
但是如果postdata只是json數據呢?此時相對于第一種content-type是否就沒有區(qū)別了藏杖?第一種一直都是一種相應頭,進來逐漸被用作請求頭脉顿。這個時候前端提交的數據是 json格式的字符串
form的enctype屬性為編碼方式蝌麸,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,默認為application/x-www-form-urlencoded艾疟。 當action為get時候来吩,瀏覽器用x-www-form-urlencoded的編碼方式把form數據轉換成一個字串(name1=value1&name2=value2...),然后把這個字串append到url后面蔽莱,用?分割弟疆,加載這個新的url。 當action為post時候盗冷,瀏覽器把form數據封裝到http body中怠苔,然后發(fā)送到server。 如果沒有type=file的控件正塌,用默認的application/x-www-form-urlencoded就可以了嘀略。 但是如果有type=file的話,就要用到multipart/form-data了乓诽。瀏覽器會把整個表單以控件為單位分割帜羊,并為每個部分加上Content-Disposition(form-data或者file),Content-Type(默認為text/plain),name(控件name)等信息,并加上分割符(boundary).
POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
最近老是有前端同事問我在用Aangular的$http服務器的時候向服務器發(fā)送數據不成功鸠天,后來我測試了一下讼育,發(fā)現(xiàn)服務器的接口接收的數據的格式是form表單形式,而Angular的$http服務發(fā)送的post請求默認是json數據格式所以數據接收不到
ajax傳JSON時設置的contenttype 如果是application/json或者text/json時,JAVA中request.getParameter("")怎么也接收不到數據奶段,如果將contenttype 換成application/x-www-form-urlencoded 就好了
contentType: 告訴服務器饥瓷,我要發(fā)什么類型的數據
dataType:告訴服務器,我要想什么類型的數據痹籍,如果沒有指定呢铆,那么會自動推斷是返回
XML,還是JSON蹲缠,還是script棺克,還是String。
application/x-javascript text/xml->xml數據 application/x-javascript->json對象 application/x-www-form-urlencoded->表單數據 application/json;charset=utf-8 -> json數據
不使用contentType: “application/json”則data可以是對象
data: { id: nodeId },
使用contentType: “application/json”則data只能是json字符串
data: "{'id': " + nodeId +"}",
$.ajax({
url: actionurl,
type: "POST",
datType: "JSON",
data: { id: nodeId },
async: false,
success: function () {}
});
$.ajax({
url: actionurl,
type: "POST",
datType: "JSON",
contentType: "application/json"
data: "{'id': " + nodeId +"}",
async: false,
success: function () {}
});
http://blog.csdn.net/calyxmelo/article/details/54969244
選擇application/x-www-form-urlencoded還是application/json线定,得看你是否有從request.paramter獲取請求數據的需求娜谊。
http://blog.csdn.net/HEL_WOR/article/details/52123712
最近在看書時才真正搞明白,服務器為什么會對表單提交和文件上傳做特殊處理斤讥,因為表單提交數據是名值對的方式纱皆,且Content-Type為application/x-www-form-urlencoded,而文件上傳服務器需要特殊處理芭商,普通的post請求(Content-Type不是application/x-www-form-urlencoded)數據格式不固定派草,不一定是名值對的方式,所以服務器無法知道具體的處理方式蓉坎,所以只能通過獲取原始數據流的方式來進行解析澳眷。
jquery在執(zhí)行post請求時,會設置Content-Type為application/x-www-form-urlencoded蛉艾,所以服務器能夠正確解析钳踊,而使用原生ajax請求時,如果不顯示的設置Content-Type勿侯,那么默認是text/plain拓瞪,這時服務器就不知道怎么解析數據了,所以才只能通過獲取原始數據流的方式來進行解析請求數據助琐。
http://blog.csdn.net/mhmyqn/article/details/25561535
對我們而已最大的區(qū)別祭埂,老的content-type不會導致在前端發(fā)出去options請求,而是直接post請求兵钮。這樣后端可以使用tomcat(bw tomcat不支持options請求蛆橡,而此處剛好省掉了options請求),同事只需要設置Access-Control-Allow-Origin這一個http頭允許"*"就可以了掘譬,可以忽略其他多個跨域相關的http header.
那么使用老的content-type,在設計adn項目時put請求出過問題泰演?出現(xiàn)了options請求,所以修改了bw http connection的serverType到httpComponent葱轩?