HTTP 請(qǐng)求方法
HTTP/1.1 協(xié)議規(guī)定的 HTTP 請(qǐng)求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。其中 POST 一般用來(lái)向服務(wù)端提交數(shù)據(jù),本文主要討論 POST 提交數(shù)據(jù)的幾種編碼方式。
協(xié)議規(guī)定 POST 提交的數(shù)據(jù)必須放在消息主體(entity-body)中,但協(xié)議并沒(méi)有規(guī)定數(shù)據(jù)必須使用什么編碼方式。但是,數(shù)據(jù)發(fā)送出去,還要服務(wù)端解析成功才有意義。
服務(wù)端通常是根據(jù)請(qǐng)求頭(headers)中的 Content-Type 字段來(lái)獲知請(qǐng)求中的消息主體是用何種方式編碼,再對(duì)主體進(jìn)行解析。POST 提交數(shù)據(jù)方案,包含了 Content-Type 和消息主體編碼方式兩部分。下面就正式開(kāi)始介紹它們。
四種常見(jiàn)的 POST 提交數(shù)據(jù)方式:
1.application/x-www-form-urlencoded
2.multipart/form-data
3.application/json
4.text/xml
1.APPLICATION/X-WWW-FORM-URLENCODED
這應(yīng)該是最常見(jiàn)的 POST 提交數(shù)據(jù)的方式了。瀏覽器的原生 form 表單,如果不設(shè)置 enctype屬性,那么最終就會(huì)默認(rèn)以 application/x-www-form-urlencoded 方式提交數(shù)據(jù)。
在POST提交數(shù)據(jù)中Content-Type 被指定為 application/x-www-form-urlencoded;提交的數(shù)據(jù)按照 key1=val1&key2=val2 的方式進(jìn)行編碼,key 和 val 都進(jìn)行了 URL 轉(zhuǎn)碼。大部分服務(wù)端語(yǔ)言都對(duì)這種方式有很好的支持。很多時(shí)候,我們用 Ajax 提交數(shù)據(jù)時(shí),也是使用這種方式。
xhr.open("POST","http://www.example.com",true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
2.MULTIPART/FORM-DATA
這也是一個(gè)常見(jiàn)的 POST 數(shù)據(jù)提交的方式。我們使用表單上傳文件時(shí),必須讓 form 的 enctype 等于這個(gè)值。這種方式一般用來(lái)上傳文件,各大服務(wù)端語(yǔ)言對(duì)它也有著良好的支持。上面提到的這兩種 POST 數(shù)據(jù)的方式,都是瀏覽器原生支持的。
xhr.open("POST","http://www.example.com",true);
xhr.setRequestHeader("Content-Type", "application/json");
3.APPLICATION/JSON
application/json 這個(gè) Content-Type 作為響應(yīng)頭大家肯定不陌生。實(shí)際上,現(xiàn)在越來(lái)越多的人把它作為請(qǐng)求頭,用來(lái)告訴服務(wù)端消息主體是序列化后的 JSON 字符串。由于 JSON 規(guī)范的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務(wù)端語(yǔ)言也都有處理 JSON 的函數(shù),使用 JSON 不會(huì)遇上什么麻煩。
xhr.open("POST","http://www.example.com",true);
xhr.setRequestHeader("Content-Type", "application/json");
順便提一句,angular框架默認(rèn)的post采用是這種編碼,PHP端不能直接使用$POST接受,使用
$_POST = json_decode(file_get_contents('php://input'),true);
4.TEXT/XML
它是一種使用 HTTP 作為傳輸協(xié)議,XML 作為編碼方式的遠(yuǎn)程調(diào)用規(guī)范,它的使用也很廣泛,能很好的支持已有的 XML-RPC 服務(wù)。不過(guò),XML 結(jié)構(gòu)還是過(guò)于臃腫,一般場(chǎng)景用 JSON 會(huì)更靈活方便。
xhr.open("POST","http://www.example.com",true);
xhr.setRequestHeader("Content-Type", "text/xml");