自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

字節(jié)二面:GET 請(qǐng)求能上傳圖片嗎?我蒙了

開發(fā) 后端
曾經(jīng)遇到的面試題,覺得挺有意思,來說下我的答案及思考過程。

 [[434530]]

前言

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

首先,我們要知道的是,圖片一般有兩種傳輸方式:base64和file對(duì)象。

base64 圖片

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

base64的本質(zhì)是字符串,而GET請(qǐng)求的參數(shù)在url里面,所以直接把圖的base64數(shù)據(jù)放到url里面,就可以實(shí)現(xiàn)GET請(qǐng)求傳圖片。

input輸入框拿到的圖是file對(duì)象,圖片file對(duì)象轉(zhuǎn)base64: 

  1. // img參數(shù):file文件或者blob  
  2. const getBase64 = img => {  
  3.   return new Promise((resolve,reject) => {  
  4.     const reader = new FileReader();  
  5.     reader.onload = e => {  
  6.       resolve(e.target.result);  
  7.     };  
  8.     reader.onerror = e => reject(e);  
  9.     reader.readAsDataURL(img);  
  10.   })  

問題來了,GET請(qǐng)求的url長度是有限制的,不同的瀏覽器長度限制不一樣,最長的大概是 10k 左右,根據(jù)base64的編碼原理,base64圖片大小比原文件大小大 1/3,所以說base64只能傳一些非常小的小圖,大圖的base64太長會(huì)被截?cái)唷?/p>

但其實(shí)這個(gè)長度限制是瀏覽器給的,而不是GET請(qǐng)求本身,也就說,在服務(wù)端,GET請(qǐng)求長度理論上無限長,也就是可以傳任意大小的圖片。

file 對(duì)象

我們來看看這個(gè)場(chǎng)景: 

  1. <form action="http://localhost:8080/" method="get">  
  2.     <input type="file" name="logo">  
  3.     <input type="submit">  
  4. </form> 

選擇圖片,然后提交表單,能提交成功,但是接口收不到文件。請(qǐng)求的url會(huì)變成http://localhost:8080/?logo=xxx.png,但是不會(huì)攜帶圖片數(shù)據(jù)。正常情況,file對(duì)象數(shù)據(jù)是放在POST請(qǐng)求的body里面,并且是form-data編碼。

推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice

那么GET請(qǐng)求能否有body體呢?

答案是可以有。

GET和POST并沒有本質(zhì)上的區(qū)別,他們只是HTTP協(xié)議中兩種請(qǐng)求方式,僅僅是報(bào)文格式不同(或者說規(guī)范不同)。

做過底層開發(fā)的同事可能比較熟悉,之前我們C語言的同事和我講,我們的HTTP請(qǐng)求,他們收到是這樣子的:

舉個(gè)栗子, 一個(gè)普通的 GET 請(qǐng)求,他們收到是這樣的: 

  1. GET /test/?sex=man&name=zhangsan HTTP/1.1  
  2. Host: http://localhost:8080  
  3. Accept: application/json, text/plain, */*  
  4. Accept-Encoding: gzip, deflate  
  5. Accept-Language: zh-CN,zh;q=0.9  
  6. Connection: Keep-Alive 

POST 請(qǐng)求長這樣: 

  1. POST /add HTTP/1.1  
  2. Host: http://localhost:8080  
  3. Content-Type: application/x-www-form-urlencoded  
  4. Content-Length: 40  
  5. Connection: Keep-Alive  
  6. sex=man&name=Professional 

同樣,DELETE、PUT、PATCH請(qǐng)求,也都是這樣的報(bào)文。底層解析這個(gè)報(bào)文的時(shí)候,并不關(guān)心是什么請(qǐng)求,所以說GET請(qǐng)求也可以有body體,也可以傳form-data數(shù)據(jù)。

有興趣的可以拿 postman 試一下,看看GET請(qǐng)求傳圖片,接口能不能收到圖片文件:

結(jié)尾

綜上所述,GET 請(qǐng)求是可以傳圖片的,但是 GET 和 POST 的規(guī)范還是要遵守的,如果有后臺(tái)讓你這么做,錘他就行了! 

 

責(zé)任編輯:龐桂玉 來源: java版web項(xiàng)目
相關(guān)推薦

2025-01-15 07:54:02

2024-07-01 00:00:02

2023-05-07 07:45:31

2021-02-06 09:07:58

字節(jié)跳動(dòng)消息

2025-01-03 08:42:59

數(shù)據(jù)庫三范式架構(gòu)

2025-04-14 01:11:00

2021-06-30 17:38:03

Trie 樹字符Java

2025-03-28 10:47:05

開發(fā)注解Java

2024-05-09 16:23:14

華為事務(wù)類型

2024-08-30 08:59:15

2021-03-01 11:53:15

面試偽共享CPU

2025-04-08 09:20:00

Sentinel限流微服務(wù)

2022-08-13 12:07:14

URLHTTP加密

2021-06-07 09:37:24

蘋果數(shù)據(jù)開發(fā)

2021-01-26 01:55:24

HTTPS網(wǎng)絡(luò)協(xié)議加密

2021-03-15 11:20:46

HTTPS優(yōu)化前端

2023-11-27 08:57:24

GoGET

2023-06-29 08:43:44

DNS解析IP

2022-03-14 11:05:01

RocketMQRedis緩存

2022-06-02 10:54:16

BrokerRocketMQ
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)