[HTTP] Content Type
本文非原創,以下是參考資料:
覺得自己一直都沒有很清楚 HTTP Content-Type 這塊,
每次在傳 POST api 資料時,都不知道為什麼要傳這類型的 Content-type,
所以決定來整理一下
什麼是 Content-type ?
簡介
HTTP 向接收方說明傳輸資料的的媒體類型 (media type),
媒體即是傳送訊息的一個傳輸的管道或形式,像是 文字(text)、圖片(image)、影片(video)、音樂(audio)、應用程式(application)等等,
在瀏覽器中,response 會根據 Content-type 決定顯示的樣子,
若在 response header 中聲明了 Content-type: image/jpeg,則資料會以圖片方式呈現
若沒有標明,則會預設帶 Content-type: text/html,以文字方式呈現
<?php
header('Content-type: image/jpeg');
echo file_get_contents("https://media.geeksforgeeks.org/wp-content/uploads/geeksforgeeks.png");
?>
輸出結果:

<?php
// Without Content-type, will be text/plain
echo file_get_contents("https://media.geeksforgeeks.org/wp-content/uploads/geeksforgeeks.png");
?>
輸出結果:
?PNG IHDRX??'?iCCPsRGB IEC61966-2.1(?u??+DQ??3????????????63??P????H?U????l??RDJV???9oF?
$sn????{N???pZ??^?d?Z(p?E?]??h??QEW?f??T??{, f???????????z?aE??????y???6%]>vkrA?;S?????d??M?
¡?6???`%?????&???Q-Z?j????BSZo?a???}N ?._u {??#??N?g?{-bKGD??????? pHYs.#.#x??vtIME?4_?X
IDATx??w?U??????MB$??$@@? 2t?"EDa???"? C?*C????Hq?ja??w ????????L{??}?}??w?;??{???{.4, ???j???
q10??_??h2]`P??:^?5??@?W?=????????XY??? w.??9??`z?1?!V??B????XM~^?|?1?qm???(?h??C?OV?js{e?+
L?b?{%?@`?+:sQ?@?
規範
Content-Type 包含以下 3 個部分,
- media type:資料的 media type,以 MIME 為標準
- charset:數據用何種字符集
- boundary:資料分格符號,當有複合型 media 時 (multipart / message) (RFC2046 page 5)
,此部分是必須的,用來分隔不同的資料;由 1 到 70 個字元組成,瀏覽器會自動加上,不用自己加
HTTP 可使用的 media type 是參照 MIME (Multipurpose Internet Mail Extensions) 而來,
MIME 是一種標準,因為早期的電子郵件只能用文字傳輸,而當後續的電子郵件開始需要傳輸圖片、影片、音樂等等,
就需要一種標準來表示這些媒體類型
POST 請求常用的 media type
GET 和 POST 是我們最常用的兩個 HTTP 請求方法。對於 GET請求,需要傳遞的數據比較簡單,我們通常使用 queryString 的方式傳遞,例如 https://test.com/api?a=1&b=2 ,
Content-Type 的值就沒有太大作用了。
...
The Content-Type header field specifies the nature of the data in the
body of an entity by giving media type and subtype identifiers, ...
...
但對於 POST 請求,Content-Type 的值就非常重要了,需要根據不同場景做不同選擇,我們依常見的需求介紹: