HTTP 協(xié)議是以 ASCII 碼傳輸,建立在 TCP/IP 協(xié)議之上的應(yīng)用層規(guī)范,規(guī)定HTTP 請求分為三個部分:
- 狀態(tài)行
- headers 請求頭
- entity-body 消息主體
HTTP協(xié)議規(guī)定 POST 提交的數(shù)據(jù)必須放在消息主體(entity-body)中。
enctype 屬性規(guī)定在發(fā)送到服務(wù)器之前應(yīng)該如何對表單數(shù)據(jù)進(jìn)行編碼。服務(wù)端通常是根據(jù)請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體是用何種方式編碼,再對主體進(jìn)行解析。
四種常見的 POST 提交數(shù)據(jù)方式
| 值 | 描述 |
|---|---|
| application/x-www-form-urlencoded | 在發(fā)送前編碼所有字符(默認(rèn)) |
| multipart/form-data | 不對字符編碼。在使用包含文件上傳控件的表單時,必須使用該值。 |
| application/json | 作為請求頭告訴服務(wù)端消息主體是序列化的JSON字符串。除低版本的IE,基本都支持。 |
| text/plain | 空格轉(zhuǎn)換為 “+” 加號,但不對特殊字符編碼。 |
- 瀏覽器的原生 <form>表單,如果不設(shè)置 enctype 屬性,那么最終就會以 application/x-www-form-urlencoded 方式提交數(shù)據(jù)。如
POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
我們使用表單上傳文件時,必須將 enctype 設(shè)為 multipart/form-data。
application/json作為請求頭,用來告訴服務(wù)端消息主體是序列化的JSON字符串。如
BASHPOST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
- text/xml,一種使用 HTTP 作為傳輸協(xié)議,XML 作為編碼方式的遠(yuǎn)程調(diào)用規(guī)范。XML-RPC(XML Remote Procedure Call),如
POST http://www.example.com HTTP/1.1
Content-Type: text/xml
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>