一道面試題,GET 請求能傳圖片嗎?

一道面試題,GET 請求能傳圖片嗎?

從一道面試題說起:GET 請求能傳圖片嗎?

「前言」

曾經遇到的面試題,覺得挺有意思,來說下我的答案及思考過程。

首先,我們要知道的是,圖片一般有兩種傳輸方式: 和 物件。

base64 圖片

圖片的編碼想必大家都見過:

的本質是字串,而  請求的引數在  裡面,所以直接把圖的  資料放到  裡面,就可以實現  請求傳圖片。

輸入框拿到的圖是  物件,圖片  物件轉  :

問題來了, 請求的  長度是有限制的,不同的瀏覽器長度限制不一樣,最長的大概是 10k 左右,根據  的編碼原理,圖片大小比原檔案大小大 1/3,所以說  只能傳一些非常小的小圖,大圖的  太長會被截斷。但其實這個長度限制是瀏覽器給的,而不是  請求本身,也就說,在服務端, 請求長度理論上無限長,也就是可以傳任意大小的圖片。

file 物件

我們來看看這個場景:

選擇圖片,然後提交表單,能提交成功,但是介面收不到檔案。請求的  會變成 ,但是不會攜帶圖片資料。正常情況, 物件資料是放在請求的  裡面,並且是  編碼。那麼  請求能否有  體呢?答案是可以有。 和  並沒有本質上的區別,他們只是  協議中兩種請求方式,僅僅是報文格式不同(或者說規範不同)。做過底層開發的同事可能比較熟悉,之前我們C語言的同事和我講,我們的  請求,他們收到是這樣子的:

一道面試題,GET 請求能傳圖片嗎?

舉個栗子, 一個普通的 GET 請求,他們收到是這樣的:

POST 請求長這樣:

同樣,、、 請求,也都是這樣的報文。底層解析這個報文的時候,並不關心是什麼請求,所以說 請求也可以有 體,也可以傳  資料。有興趣的可以拿 postman(我用的版本是 v7。30。1) 試一下,看看  請求傳圖片,介面能不能收到圖片檔案:

。所謂協議就是大家共同遵守的一套規則,你不遵守某一規則有時候確實不會有大問題,但是其行為表現是什麼就不得而知了。協議帶來規範化,規範化帶來高效。事實是 HTTP 1。1 的 RFC 文件裡沒有禁止 GET 請求帶 body ,但是也沒有定義 GET 請求 body 的語義。

參見: 。

A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request。

總結

作為面試題的話,本題大概有兩個考點:

二進位制圖片序列化 base64;

特定場景的 url 長度限制。

部分 http 協議知識。

或者說,真要 get 傳圖片作為方案的話,需要打通上面兩個關鍵技術問題。面試現場也可以再加一些Blob、TypedArray、圖片壓縮方案之類的。

最近面試BAT,整理一份面試資料《

Java面試BATJ通關手冊

》,覆蓋了Java核心技術、JVM、Java併發、SSM、微服務、資料庫、資料結構等等。

文章有幫助的話,在看,轉發吧。

謝謝支援喲 (*^__^*)