转公众号: java大后端

前言

曾经遇到的面试题,觉得挺有意思,来说下我的答案及思考过程。

首先,我们要知道的是,图片一般有两种传输方式: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 

同样,DELETEPUTPATCH 请求,也都是这样的报文。底层解析这个报文的时候,并不关心是什么请求,所以说 GET请求也可以有body 体,也可以传 form-data 数据。

有兴趣的可以拿 postman 试一下,看看 GET 请求传图片,接口能不能收到图片文件:

结尾

综上所述,GET 请求是可以传图片的,但是 GET 和 POST 的规范还是要遵守的,如果有后台让你这么做,锤他就行了!

面试:GET 请求能上传图片吗,已解决相关推荐

  1. 【已解决】(uni-app)IOS 端 H5 应用无法发起请求,请求状态码为0,错误描述为request:fail

    [已解决](uni-app)IOS 端 H5 应用无法发起请求,请求状态码为0,错误描述为request:fail 目录 [已解决](uni-app)IOS 端 H5 应用无法发起请求,请求状态码为0 ...

  2. 已解决 0x0000XXXX (ucrtbase.dll) (XXX.exe 中)处有未经处理的异常: 请求了严重的程序退出。

    已解决!ucrtbase.dll, XXX.exe 中处有未经处理的异常: 请求了严重的程序退出. 问题描述 解决方法 问题描述 最近在编译IFC++工程,发现在运行的时候VS2019弹出了相关错误提 ...

  3. 安全狗服务器自动重启,关于解决安全狗“您的请求过于频繁,已被管理员设置拦截”方法...

    他们在使用安全狗后访问自己的网站或者访客在访问其他人的网站时经常会弹出"您的请求过于频繁,已被管理员设置拦截"的页面,如图所示 首先我们应该先看一下在防护日志中安全狗有何记录拦截信 ...

  4. (已解决)关键词爬取百度搜索结果,返回百度安全验证,网络不给力,请稍后重试,无法请求到正确数据的问题(2023最新)

    已解决,使用关键词进行百度搜索,然后爬取搜索结果,请求数据后,返回的是百度安全验证,网络不给力,请稍后重试.无法请求到正确数据.且尝试在header中增加Accept参数还是不行. 一.问题产生的现象 ...

  5. 已解决requests.exceptions.ConnectTimeout: HTTPConnectionPool(host=‘123.96.1.95‘, port=30090): Max retri

    已解决requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='123.96.1.95', port=30090): Max retri ...

  6. 已解决UserWarning: Manipulating `w3c` setting can have unintended consequences.

    已解决UserWarning: Manipulating w3c setting can have unintended consequences. warnings.warn(UserWarning ...

  7. 已解决Python调用免费申请的百度图形识别接口案例

    已解决Python调用免费申请的百度图形识别接口{'error_code': 18, 'error_msg': 'Open api qps request limit reached'} 文章目录 报 ...

  8. 已解决urllib模块设置代理ip

    已解决urllib模块设置代理ip 文章目录 报错代码 报错翻译 报错原因 解决方法 千人全栈VIP答疑群联系博主帮忙解决报错 报错代码 最近用urllib编写了一个简单的爬虫下载网上文件的代码,刚运 ...

  9. 已解决urllib.request.urlretrieve下载文件报错403

    已解决(python使用urlopen/urlretrieve下载文件时出现403 forbidden)urllib.error.HTTPError: HTTP Error 403: Forbidde ...

最新文章

  1. LiveVideoStack线上分享第三季(六):深度学习与视频编码
  2. 解决由于没有办理权限导致的403,权限不足
  3. WEB安全基础-Javascrp相关知识点之DOM
  4. php7 mysql json 小程序_微信小程序JSON数组递交PHP服务端解析处理
  5. 求解偏微分方程开源有限元软件deal.II学习--Step 48
  6. C# 随机数 Radom 循环生成同一的数字
  7. SpringBoot整合Magic-Api
  8. LTE/LTE advanced——UMTS 长期演进理论与实践——控制面(3)
  9. conda 查看现有虚拟环境 - 删除现有虚拟环境
  10. cli命令行配置路由器_Cisco路由CLI基础命令
  11. 数据库公共字段自动填充
  12. C语言函数的简单书写规范和调用
  13. 56-OvR 和 OvO
  14. 18个最佳代码编辑器/IDE推荐
  15. 一款轻量级的markdown编辑器
  16. 计算机软考高级职称论文,关于计算机软考,这里可以解决你所有的问题
  17. multisim安装后无法连接数据库_计算机重装系统时遭遇错误意外重启后无法安装,这是什么原因?...
  18. 【C语言】求素数的三种方案
  19. 服务器Apache配置以及改变工作目录
  20. 那些年被你亲手敲烂过的键盘

热门文章

  1. Java中的移位操作——Java编程思想笔记
  2. 什么是PCB沉金?为什么要沉金?
  3. 使用cpolar配置内网访问(内网穿透)教程(超详细,简单)
  4. activity_manager_server
  5. ARP 应用——检测IP地址冲突
  6. 大数据开发面试准备——计算机网络
  7. 字节跳动面试流程以及注意事项,各大厂具有通点,看看不吃亏!
  8. New UWP Community Toolkit - DeveloperTools
  9. 神经网络参数个数计算,神经网络的参数设置
  10. Android原生(Native)C开发