從一道面試題說起:GET 請求能傳圖片嗎?
「前言」
曾經遇到的面試題,覺得挺有意思,來說下我的答案及思考過程。
首先,我們要知道的是,圖片一般有兩種傳輸方式: 和 物件。
base64 圖片
圖片的編碼想必大家都見過:
的本質是字串,而 請求的引數在 裡面,所以直接把圖的 資料放到 裡面,就可以實現 請求傳圖片。
輸入框拿到的圖是 物件,圖片 物件轉 :
問題來了, 請求的 長度是有限制的,不同的瀏覽器長度限制不一樣,最長的大概是 10k 左右,根據 的編碼原理,圖片大小比原檔案大小大 1/3,所以說 只能傳一些非常小的小圖,大圖的 太長會被截斷。但其實這個長度限制是瀏覽器給的,而不是 請求本身,也就說,在服務端, 請求長度理論上無限長,也就是可以傳任意大小的圖片。
file 物件
我們來看看這個場景:
選擇圖片,然後提交表單,能提交成功,但是介面收不到檔案。請求的 會變成 ,但是不會攜帶圖片資料。正常情況, 物件資料是放在請求的 裡面,並且是 編碼。那麼 請求能否有 體呢?答案是可以有。 和 並沒有本質上的區別,他們只是 協議中兩種請求方式,僅僅是報文格式不同(或者說規範不同)。做過底層開發的同事可能比較熟悉,之前我們C語言的同事和我講,我們的 請求,他們收到是這樣子的:
舉個栗子, 一個普通的 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、微服務、資料庫、資料結構等等。
文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)