1. 程式人生 > >post請求上傳檔案和文字時http格式

post請求上傳檔案和文字時http格式

服務端通常是根據請求頭(headers)中的 Content-Type 欄位來獲知請求中的訊息主體是用何種方式*編碼*,再對主體進行解析。所以說到 POST 提交資料方案,包含了 Content-Type 和訊息主體編碼方式兩部分。

application/x-www-form-urlencoded

最基本的form表單結構,用於傳遞字元引數的鍵值對,請求結構如下

POST  HTTP/1.1
Host: www.demo.com
Cache-Control: no-cache
Postman-Token: 81d7b315-d4be-8ee8-1237-04f3976de032
Content-Type
: application/x-www-form-urlencoded key=value&testKey=testValue

請求頭中的Content-Type設定為application/x-www-form-urlencoded; 提交的的資料,請求body中按照 key1=value1&key2=value2 進行編碼,key和value都要進行urlEncode;

multipart/form-data

這是上傳檔案時,最常見的資料提交方式,看一下請求結構

POST  HTTP/1.1
Host: www.demo.com
Cache-Control: no-cache
Postman-Token: 679d816d-8757-14fd-57f2-fbc2518dddd9 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="key" value ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="testKey"
testValue ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="imgFile"; filename="no-file" Content-Type: application/octet-stream // 檔案的副檔名.tif <data in here> ------WebKitFormBoundary7MA4YWxkTrZu0gW--

首先請求頭中的Content-Type 是multipart/form-data; 並且會隨機生成一個boundary, 用於區分請求body中的各個資料; 每個資料以 –boundary 開始, 緊接著換行,下面是內容描述資訊, 接著換2行, 接著是資料; 然後以 –boundary– 結尾, 最後換行;

文字資料和檔案,圖片的內容描述是不相同的
文字引數:

Content-Disposition: form-data; name="key"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

檔案引數:

Content-Disposition: form-data; name="imgFile"; filename="no-file"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

每個換行都是 \r\n ;

application/json

text/xml

text/plain

請求頭的Content-Type設定為這幾個也很常見, 不過一般是在web前端開發中,請求body沒有固定結構, 直接傳輸對應資料的資料流, 不必和上面2種樣, 還要用固定的結構包起來, 只不過資料對應的是json, xml, 文字;

總結

注意:
(1)服務端通常是根據請求頭(headers)中的 Content-Type 欄位來獲知請求中的訊息主體是用何種方式編碼,再對主體進行解析
(2)如果傳輸的是檔案,還要包含檔名(filename)和檔案型別資訊(content-type)
(3)注意:content-type在請求頭可以設定,在請求實體也可以設定;在請求頭的作用是指明提交的表單的型別和編碼方式;在請求實體的作用指明所在部分的檔案型別(比如:content-type:image/png)