当前位置:网站首页>从一道面试题说起:GET 请求能传图片吗?
从一道面试题说起:GET 请求能传图片吗?
2022-07-29 14:04:00 【俗人0417】
前言
忘了在哪里看到的这个题目,觉得挺有意思,来说下我的答案及思考过程。
首先,我们要知道的是,图片一般有两种传输方式: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 的规范还是要遵守的,如果有后台让你这么做,锤他就行了!
边栏推荐
猜你喜欢

C#实现线程管理类

2022年了!还在用定时器实现动画?赶紧试试requestAnimationFrame吧!

【微信小程序】全局配置

苹果官方降价的原因找到了,它也面临销量下滑乃至出现库存问题

如何编辑CAD图库里的图纸

【FreeSwitch开发实践】自定义模块创建与使用

面试官:大量请求 Redis 不存在的数据,从而影响数据库,该如何解决?

中国互联网科技企业群狼围攻,谷歌终于遭受重挫导致利润大跌,它为推动鸿蒙的发展而后悔...

C51 存储类型与存储模式

Offensive EA&UML day arch - activity diagram: : Variable Actions (continue)
随机推荐
解决:Parameter 0 of method ribbonServerList in com.alibaba.cloud.nacos.ribbon.NacosRibbonClientConfigu
C51 存储类型与存储模式
Some thoughts on paying for knowledge
hyperbench:plugin.Open(“./fabric“): plugin was built with a different version of package golang.
打卡广汽本田喜悦安全驾驶中心,体验最刁钻的场地训练
Gdb debugging common concepts finishing
系列文章|云原生时代下微服务架构进阶之路 - Boris
[10:00 Open Class]: Application Exploration of Kuaishou GPU/FPGA/ASIC Heterogeneous Platform
Shared memory - shmget filling holes
Pinia状态持久化
【模板引擎】微服务学习笔记六:freemarker模板引擎的常用命令介绍
【堡垒机小知识】硬件堡垒机是什么意思?其与云堡垒机有什么区别?
Chinese Internet technology companies were besieged by wolves. Google finally suffered a severe setback and its profits fell sharply. It regretted promoting the development of Hongmeng...
Nine kinds of way, teach you to read the resources files in the directory path
Children's programming electronics (graphical programming Scratch secondary level exam parsing (choice) in June 2022
如何使用SparkSQL做一些简单的数据分析和可视化展示?
第4章_2——视图的使用
Google Cloud X Kyligence|如何从业务视角管理数据湖?
马尔可夫跳变线性系统最优控制的研究现状与进展
84.(cesium之家)cesium模型在地形上运动