<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          阿里二面:GET 請(qǐng)求能傳圖片嗎?

          共 2706字,需瀏覽 6分鐘

           ·

          2022-01-01 14:56

          不點(diǎn)藍(lán)字關(guān)注,我們哪來故事?




          ?正文如下?

          來源:juejin.im/post/6860253625030017031


          從一道面試題說起:GET 請(qǐng)求能傳圖片嗎?

          # 前言

          曾經(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 :
          // img參數(shù):file文件或者blobconst 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 請(qǐng)求的 url 長(zhǎng)度是有限制的,不同的瀏覽器長(zhǎng)度限制不一樣,最長(zhǎng)的大概是 10k 左右,根據(jù) base64 的編碼原理,base64圖片大小比原文件大小大 1/3,所以說 base64 只能傳一些非常小的小圖,大圖的 base64 太長(zhǎng)會(huì)被截?cái)?。但其?shí)這個(gè)長(zhǎng)度限制是瀏覽器給的,而不是 GET 請(qǐng)求本身,也就說,在服務(wù)端,GET 請(qǐng)求長(zhǎng)度理論上無限長(zhǎng),也就是可以傳任意大小的圖片。微信搜索公眾號(hào):程序員開源社區(qū),回復(fù)“資源”,獲取更多精品學(xué)習(xí)資料。

          # file 對(duì)象

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


          <form?action="http://localhost:8080/"?method="get"> <input type="file" name="logo"> <input type="submit">form>

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

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


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

          POST?/add?HTTP/1.1Host: http://localhost:8080Content-Type: application/x-www-form-urlencodedContent-Length: 40Connection: Keep-Alive
          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(我用的版本是 v7.30.1) 試一下,看看 GET 請(qǐng)求傳圖片,接口能不能收到圖片文件:


          GET 請(qǐng)求能不能帶 body 這個(gè)事是由 HTTP 協(xié)議來定義的。

          所謂協(xié)議就是大家共同遵守的一套規(guī)則,你不遵守某一規(guī)則有時(shí)候確實(shí)不會(huì)有大問題,但是其行為表現(xiàn)是什么就不得而知了。協(xié)議帶來規(guī)范化,規(guī)范化帶來高效。事實(shí)是 HTTP 1.1 的 RFC 文檔里沒有禁止 GET 請(qǐng)求帶 body ,但是也沒有定義 GET 請(qǐng)求 body 的語義。

          參見: tools.ietf.org。
          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.


          # 總結(jié)

          作為面試題的話,本題大概有兩個(gè)考點(diǎn):

          1、二進(jìn)制圖片序列化 base64;

          2、特定場(chǎng)景的 url 長(zhǎng)度限制。

          3、部分 http 協(xié)議知識(shí)。

          或者說,真要 get 傳圖片作為方案的話,需要打通上面兩個(gè)關(guān)鍵技術(shù)問題。面試現(xiàn)場(chǎng)也可以再加一些Blob、TypedArray、圖片壓縮方案之類的。

          PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。

          ?關(guān)注公眾號(hào):Java后端編程,回復(fù)下面關(guān)鍵字?


          要Java學(xué)習(xí)完整路線,回復(fù)??路線?

          缺Java入門視頻,回復(fù)?視頻?

          要Java面試經(jīng)驗(yàn),回復(fù)??面試?

          缺Java項(xiàng)目,回復(fù):?項(xiàng)目?

          進(jìn)Java粉絲群:?加群?


          PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。

          (完)




          加我"微信"?獲取一份 最新Java面試題資料

          請(qǐng)備注:666,不然不通過~


          最近好文


          1、Kafka 3.0重磅發(fā)布,棄用 Java 8 的支持!

          2、你只會(huì)用 ! = null 判空?嘿嘿!

          3、這次,Swagger-ui遇到對(duì)手了!

          4、一個(gè)基于Spring Boot+Vue+Redis的物聯(lián)網(wǎng)智能家居系統(tǒng)

          5、本機(jī)號(hào)碼一鍵登錄原理與應(yīng)用



          最近面試BAT,整理一份面試資料Java面試BAT通關(guān)手冊(cè),覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
          獲取方式:關(guān)注公眾號(hào)并回復(fù)?java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
          明天見(??ω??)?
          瀏覽 15
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码激情一区二区 | 成人精品免费无码毛片 | 天天更新成人av 天天日天天操天天 | 伊人一道本 | 亚洲国产午夜在线电影网站 |