1. 程式人生 > >理解HTTP之Content-Type

理解HTTP之Content-Type

0x01.About

在HTTP 1.1規範中,HTTP請求方式有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT

通常我們用的只有GET、POST,然而對於Restful API規範來說,請求資源要用PUT方法,刪除資源要用DELETE方法。

例如傳送個DELETE包:

那麼通過id就能獲取到資訊,這個包只有header,並不存在body,下面討論幾個包含body的發包的body傳輸格式。

0x02.Content-Type

Content-Type用於指定內容型別,一般是指網頁中存在的Content-Type,Content-Type屬性指定請求和響應的HTTP內容型別。如果未指定 ContentType,預設為text/html。

在nginx中有個配置檔案mime.types,主要是標示Content-Type的檔案格式。

下面是幾個常見的Content-Type:

1.text/html
2.text/plain
3.text/css
4.text/javascript
5.application/x-www-form-urlencoded
6.multipart/form-data
7.application/json
8.application/xml

前面幾個都很好理解,都是html,css,javascript的檔案型別,後面四個是POST的發包方式。

0x03.application/x-www-form-urlencoded

application/x-www-form-urlencoded是常用的表單發包方式,普通的表單提交,或者js發包,預設都是通過這種方式,

比如一個簡單地表單:

<form enctype="application/x-www-form-urlencoded" action="http://homeway.me/post.php" method="POST">
    <input type="text" name="name" value="homeway">
    <input type="text" name="key" value="nokey">
    <input type="submit" value="submit">
</form>

那麼伺服器收到的raw header會類似:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,gl;q=0.2,de;q=0.2
Cache-Control:no-cache
Connection:keep-alive
Content-Length:17
Content-Type:application/x-www-form-urlencoded

那麼伺服器收到的raw body會是,name=homeway&key=nokey,在php中,通過$_POST就可以獲得陣列形式的資料。

0x04.multipart/form-data

multipart/form-data用在傳送檔案的POST包。

這裡假設我用python的request傳送一個檔案給伺服器:

data = {
    "key1": "123",
    "key2": "456",
}
files = {'file': open('index.py', 'rb')}
res = requests.post(url="http://localhost/upload", method="POST", data=data, files=files)
print res

通過工具,可以看到我傳送的資料內容如下:

POST http://www.homeway.me HTTP/1.1
Content-Type:multipart/form-data; boundary=------WebKitFormBoundaryOGkWPJsSaJCPWjZP

------WebKitFormBoundaryOGkWPJsSaJCPWjZP
Content-Disposition: form-data; name="key2"
456
------WebKitFormBoundaryOGkWPJsSaJCPWjZP
Content-Disposition: form-data; name="key1"
123
------WebKitFormBoundaryOGkWPJsSaJCPWjZP
Content-Disposition: form-data; name="file"; filename="index.py"

這裡Content-Type告訴我們,發包是以multipart/form-data格式來傳輸,另外,還有boundary用於分割資料。

當檔案太長,HTTP無法在一個包之內傳送完畢,就需要分割資料,分割成一個一個chunk傳送給服務端,

那麼--用於區分資料快,而後面的資料633e61ebf351484f9124d63ce76d8469就是標示區分包作用。

0x05.text/xml

微信用的是這種資料格式傳送請求的。

POST http://www.homeway.me HTTP/1.1 
Content-Type: text/xml

<?xml version="1.0"?>
<resource>
    <id>123</id>
    <params>
        <name>
            <value>homeway</value>
        </name>
        <age>
            <value>22</value>
        </age>
    </params>
</resource>

php中$_POST只能讀取application/x-www-form-urlencoded資料,$_FILES只能讀取multipart/form-data型別資料,

那麼,要讀取text/xml格式的資料,可以用:

[Math Processing Error]file=fopen(‘php://input′,‘rb′);data = fread([Math Processing Error]file,length);fclose(file);

或者

$data = file_get_contents(‘php://input’);

0x06.application/json

通過json形式將資料傳送給伺服器,一開始,我嘗試通過curl,給伺服器傳送application/json格式包,

然而我收到的資料如下:

————————–e1e1406176ee348a Content-Disposition: form-data; name=”nid” 2 ————————–e1e1406176ee348a Content-Disposition: form-data; name=”uuid” cf9dc994-a4e7-3ad6-bc54-41965b2a0dd7 ————————–e1e1406176ee348a Content-Disposition: form-data; name=”access_token” 956731586df41229dbfec08dd5d54eedb98d73d2 ————————–e1e1406176ee348a–

後來想想明白了,HTTP通訊中並不存在所謂的json,而是將string轉成json罷了,也就是,application/json可以將它理解為text/plain,普通字串。

之所以出現那麼多亂七八糟的-------應該是php陣列傳輸進去,存在的轉換問題吧(我目前能想到的原因)。

相關推薦

理解HTTPContent-Type

0x01.About 在HTTP 1.1規範中,HTTP請求方式有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 通常我們用的只有GET、POST,然而對於Restful API規範來說,請求資源要用PUT方法,刪除資源要

2018/06/07 HTTPContent-Type 的作用

php chunk cat 屬性 說明 multipart HR 部分 doctype 在此之前先看一個小例子: <?php var_dump($_FILES);?> <!DOCTYPE html> <html> <hea

轉載jmeter(七)http請求—content-type與參數

req media ref http art 選中 配置 nbsp target 本文講三種content-type以及在Jmeter中對應的參數輸入方式 第一部分:目前工作中涉及到的content-type 有三種: content-type:在Request Heade

Ubuntu下Firefox播放mp3顯示HTTP "Content-Type" of "audio/mpeg" is not supported錯誤的解決辦法

在Ubuntu下,使用javascript進行mp3播放 var audio = new Audio('file.mp3'); audio.play(); 如果遇到 HTTP “Content-Type” of “audio/mpeg” is not supporte

什麼是http協議?get和post請求有什麼區別?http請求content-Type有幾種,有什麼區別?http適合什麼場景?http狀態碼有哪些?

這裡是修真院後端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】 八個方面深度解析後端知識/技能,本篇分享的是: 【什麼是http協議?get和post請求有什麼區別?http請求content-Type有幾種

HttpContent-Type的詳解

application/x-www-form-urlencoded 資料被編碼為名稱/值對。這是標準的編碼格式 資料包 POST http://test.com/u1 HTTP/1.1 Content-Type: application/x-www-form-u

http頭部content-type與資料格式

http 頭部中的 content-type  和我們傳遞的資料是息息相關的,不同的取值,伺服器解析處理方式不同, 介紹一下幾種常見的方式 text/plain:ajax預設方式,將檔案設定為純文字的形式,瀏覽器在獲取到這種檔案時並不會對其進行處理(最原始的流) appl

HTTP常見Content-Type比較

1. application/x-www-form-urlencoded 最常見的 POST 提交資料的方式了。瀏覽器的原生 form 表單,如果不設定 enctype 屬性,那麼最終就會以 ap

HttpContent-Type等屬性詳解

前言 一直以來對HTTP請求中各種屬性一知半解,偶然在部落格中找到一篇,特意摘錄過來方便自己以後檢視. 正文 敬請關注部落格,後期不斷更新優質博文,謝謝 這裡講解Content-Type的可用值,以及在spring MVC中如何

httpContent-Type(內容型別)

Content-Type,內容型別,一般是指網頁中存在的Content-Type,用於定義網路檔案的型別和網頁的編碼,決定檔案接收方將以什麼形式、什麼編碼讀取這個檔案,這就是經常看到一些Asp網頁點選的結果卻是下載到的一個檔案或一張圖片的原因。 Content

Jmeter入門3 http請求—content-type與參數

pos 方式 目前 data 數值 請求 ron cati mime 本文講三種content-type以及在Jmeter中對應的參數輸入方式 第一部分:目前工作中涉及到的content-type 有三種: content-type:在Request Header

我的Android進階旅------>HTTP Content-type 對照表

 HTTP Content-type 對照表 副檔名 Content-Type(Mime-Type) 副檔名 Content-Type(Mime-Type)    .*( 二進位制流, 不知道下載檔案型別) application/octet-str

Http Content-Type

data com 文本格式 ima 內容 類型 cat 進行 sdn 常見的媒體格式類型如下: text/html : HTML格式 text/plain :純文本格式 text/xml : XML格式 image

Http的那些事: Content-Type

article hba 數據 找不到 oschina dex ria ack null Content-Type 無疑是http中一個非常重要的屬性了, request 中可以存在, 也可以不存在( request的Content-Type 默認是 */*, 實際上呢, 如

http請求中content-type的那些事兒

在jquery+ajax盛行的年代裡,前後端互動實在太方便了,ajax發起一個請求就是這麼簡單 $.ajax({ url:'', type:'post', data:{},//引數 ... }) 久而久之,裡面很多的細節都被我們忽略了,等到有一天,沒有jque

HTTP中的Content-Type和Accept

版權宣告:本文為博主原創文章,無需授權即可轉載,甚至無需保留以上版權宣告,轉載時請務必註明作者。 https://blog.csdn.net/weixin_43453386/article/details/83537483 HTTP中的Content-Type和Accept

loadrunner使用web_add_header新增HTTP資訊頭(比如Content-Type,token等)和使用

關於loadrunner使用web_add_header新增HTTP資訊頭(比如Content-Type,token等)和使用 1.web_add_header新增HTTP資訊頭(比如Content-Type,token等)   2.用web_custom_request

HTTP content-type對照表

副檔名 Content-Type(Mime-Type) 副檔名 Content-Type(Mime-Type) .*( 二進位制流,不知道下載檔案型別) application/oc

詳解Http請求中Content-Type講解以及在Spring MVC中的應用

activit allow 視頻 標註 範圍 password length ted back 詳解Http請求中Content-Type講解以及在Spring MVC中的應用 引言: 在Http請求中,我們每天都在使用Content-type來指定不同格式的請求信息,但是

HTTP協議:Content-Type

POST提交資料之---Content-Type的理解;    Content-Type是指http/https傳送資訊至伺服器時的內容編碼型別,contentType用於表明傳送資料流的型別,伺服器根據編碼型別使用特定的解析方式,獲取資料流中的資料。 在網路請求中,常用的C