欢迎关注方志朋的博客,回复”666“获面试宝典

从一道面试题说起:GET 请求能传图片吗?

「前言」

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

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

同样,DELETEPUTPATCH 请求,也都是这样的报文。底层解析这个报文的时候,并不关心是什么请求,所以说 GET请求也可以有body 体,也可以传 form-data 数据。有兴趣的可以拿 postman(我用的版本是 v7.30.1) 试一下,看看 GET 请求传图片,接口能不能收到图片文件:

GET 请求能不能带 body 这个事是由 HTTP 协议来定义的。所谓协议就是大家共同遵守的一套规则,你不遵守某一规则有时候确实不会有大问题,但是其行为表现是什么就不得而知了。协议带来规范化,规范化带来高效。事实是 HTTP 1.1 的 RFC 文档里没有禁止 GET 请求带 body ,但是也没有定义 GET 请求 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.

总结

作为面试题的话,本题大概有两个考点:

  1. 二进制图片序列化 base64;

  2. 特定场景的 url 长度限制。

  3. 部分 http 协议知识。

或者说,真要 get 传图片作为方案的话,需要打通上面两个关键技术问题。面试现场也可以再加一些Blob、TypedArray、图片压缩方案之类的。

原文地址:https://juejin.im/post/6860253625030017031

热门内容:
  • 妙用Java 8中的 Function接口 消灭if...else(非常新颖的写法)

  • 阿里二面:现针对一个请求量10000次/s的秒杀系统,说说你的优化思路

  • 阿里3大编程语言,Java没上榜!

  • 在部队当程序员是什么体验?

  • mybatis-plus团队新作:mybatis-mate 轻松搞定数据权限

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

阿里二面:GET 请求能传图片吗?相关推荐

  1. GET 请求能传图片吗?

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 2.4 分钟. 作者:沉末 原文地址:https://juejin.im/post/6860253625030017031 前 ...

  2. 本地图片转base64_从一道面试题说起:GET 请求能传图片吗?

    前言 忘了在哪里看到的这个题目,觉得挺有意思,来说下我的答案及思考过程. 首先,我们要知道的是,图片一般有两种传输方式:base64 和 file 对象. base64 图片 图片的base64编码想 ...

  3. base64转图片_从一道面试题说起:GET 请求能传图片吗?

    前言 忘了在哪里看到的这个题目,觉得挺有意思,来说下我的答案及思考过程. 首先,我们要知道的是,图片一般有两种传输方式:base64 和 file 对象. base64 图片 图片的base64编码想 ...

  4. JAVA实现生成原生二维码并上传至阿里云

    JAVA生成二维码并上传至阿里云 pom依赖 <dependency><groupId>com.google.zxing</groupId><artifact ...

  5. Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器)

    Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器) 主要思路 上传图片的思路有两种: 第一种是上传到应用服务器,再由应用服务器上传到OSS.这种适合上传的文件较小,较为简单, ...

  6. 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决

    文章目录 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 2.解决方案 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 上传的文件,未指定文件访 ...

  7. Nginx的安装基础配置(windows、linux)以及搭建图片服务器(windows、阿里云),文件上传

    Nginx的安装基础配置(windows.linux)以及搭建图片服务器(windows.阿里云),文件上传 本文目录 文章目录 Nginx的安装基础配置(windows.linux)以及搭建图片服务 ...

  8. Android-上传图片(二)_HttpClient

    上篇博文中记录了使用HttpURLConnection模拟HTTP请求上传文件到服务端 Android-上传图片(-)_HttpURLConnection 本篇博文中将使用Apache HttpCli ...

  9. 使用PicGo+阿里云OSS实现md文档图片上传

    使用PicGo+阿里云OSS实现md文档图片上传 这次给大家带来的是PicG0+阿里云Oss+typora的图床环境搭建,帮助大家提高工作效率+写博客速度! 1.typora安装 给大家一个链接:ty ...

最新文章

  1. 轮询 长轮询 websocket
  2. Cocos2d-x 生成真正的随机数
  3. 函数exit()详解:参数EXIT_FAILURE(是1),EXIT_SUCCESS(是0)
  4. xgboost防止过拟合
  5. 巴塞尔新资本协议_《巴塞尔公约》修订!进口再生颗粒或对中国产生巨大冲击...
  6. ASP.NET Core 实现带认证功能的Web代理服务器
  7. CentOS 7下宿主机使用virsh console访问KVM的设置
  8. hadoop MultipleInputs fails with ClassCastException (get fileName)
  9. 递增输出链表结点,删除重复结点
  10. 对象 复制构造函数
  11. HDU2050 由直线分割平面推广到折线分割平面
  12. CSAPP,拆弹到一点!!!
  13. java nio 大文件_java nio 超大文件的读写
  14. 如何保证服装ERP项目成功施行
  15. hp服务器3c认证证书,戴尔 Dell PowerEdge R720 服务器3C认证证书,节能认证证书
  16. 林赛登《花花公子》后桃花旺 与神秘男车场约会_0
  17. 不同vlan间通讯单臂路由和三层交换机
  18. 需要一个自习室系统,包括收费、灯控、会员管理、微信及前端订座、一卡通终端,会做的私信我,有偿。
  19. Excel使用VBA自动调整插入图片大小到单元格
  20. 【Adobe Creative Cloud】

热门文章

  1. java io 缓冲流_记忆系列-Java IO的缓存输入输出流(高效流)
  2. 问题二:相关性怎么引入?
  3. sqlserver可将字符转成数字再进行sum,如果varchar类型中存放的都是数字
  4. nodejs高版本转低版本
  5. asp.net mvc jqgrid 同一个页面查询不同的表,jqgrid显示不同表的表头和数据并且分页...
  6. DB天气app冲刺二阶段第十一天(完结)
  7. Java Socket发送与接收HTTP消息简单实现
  8. 没听说过这些,就不要说你懂并发了,three。
  9. socket 服务器浏览器与服务器客户端实例
  10. jquery实现心算练习