作者:沉末_
鏈接:https://juejin.cn/post/6860253625030017031
前言
曾經遇到的面試題,覺得挺有意思,來說下我的答案及思考程序,
首先,我們要知道的是,圖片一般有兩種傳輸方式:base64 和 file物件,
base64 圖片
圖片的base64編碼想必大家都見過:

base64 的本質是字串,而 GET 請求的引數在 url 里面,所以直接把圖的 base64 資料放到 url 里面,就可以實作 GET 請求傳圖片,
input 輸入框拿到的圖是 file 物件,圖片 file 物件轉 base64 :
// img引數:file檔案或者blob
const getBase64 = img => {
return new Promise((resolve,reject) => {
const reader = new FileReader();
reader.onload = e => {
resolve(e.target.result);
};
reader.onerror = e => reject(e);
reader.readAsDataURL(img);
})
}
問題來了,GET 請求的 url 長度是有限制的,不同的瀏覽器長度限制不一樣,最長的大概是 10k 左右,根據 base64 的編碼原理,base64圖片大小比原檔案大小大 1/3,所以說 base64 只能傳一些非常小的小圖,大圖的 base64 太長會被截斷,但其實這個長度限制是瀏覽器給的,而不是 GET 請求本身,也就說,在服務端,GET 請求長度理論上無限長,也就是可以傳任意大小的圖片,
file 物件
我們來看看這個場景:
<form action="http://localhost:8080/" method="get">
<input type="file" name="logo">
<input type="submit">
</form>
選擇圖片,然后提交表單,能提交成功,但是介面收不到檔案,請求的 url 會變成 http://localhost:8080/?logo=xxx.png,但是不會攜帶圖片資料,正常情況,file 物件資料是放在POST請求的 body 里面,并且是 form-data 編碼,
那么 GET 請求能否有 body 體呢?
答案是可以有,
GET 和 POST 并沒有本質上的區別,他們只是 HTTP 協議中兩種請求方式,僅僅是報文格式不同(或者說規范不同),做過底層開發的同事可能比較熟悉,之前我們C語言的同事和我講,我們的 HTTP 請求,他們收到是這樣子的:

舉個栗子, 一個普通的 GET 請求,他們收到是這樣的:
GET /test/?sex=man&name=zhangsan HTTP/1.1
Host: http://localhost:8080
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: Keep-Alive
POST 請求長這樣:
POST /add HTTP/1.1
Host: http://localhost:8080
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
sex=man&name=Professional
同樣,DELETE、PUT、PATCH 請求,也都是這樣的報文,底層決議這個報文的時候,并不關心是什么請求,所以說 GET請求也可以有body 體,也可以傳 form-data 資料,有興趣的可以拿 postman 試一下,看看 GET 請求傳圖片,介面能不能收到圖片檔案:

結尾
綜上所述,GET 請求是可以傳圖片的,但是 GET 和 POST 的規范還是要遵守的,如果有后臺讓你這么做,錘他就行了!
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2021最新版)
2.別在再滿屏的 if/ else 了,試試策略模式,真香!!
3.臥槽!Java 中的 xx ≠ null 是什么新語法?
4.Spring Boot 2.5 重磅發布,黑暗模式太炸了!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/349481.html
標籤:Java
上一篇:垃圾代碼和優質代碼的區別?
下一篇:【JAVA】筆記(1)---JVM記憶體圖;方法多載條件;輸入方法;轉義字符;強制型別轉換;變數分類及區別;Java命名規范;
