当前位置:网站首页>从一道面试题说起: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
的规范还是要遵守的,如果有后台让你这么做,锤他就行了!
边栏推荐
- 1192. 奖金
- Nine kinds of way, teach you to read the resources files in the directory path
- 基于降阶扩张状态观测器的逆变系统重复控制设计
- 升级 MDK 5.37 后的问题处理: AC6编译选项, printf, 重启失效等
- 【pytorch】1.6 tensor 基本运算
- 唯物辩证法-矛盾论(普遍性+特殊性+斗争性+同一性)
- Project Manager: Not bad!The SSO single sign-on code is written, and the sequence diagram is also drawn?
- Offensive EA&UML day arch - activity diagram: : Variable Actions (continue)
- 共享内存 - shmget填坑记
- 企业需要知道的5个 IAM 最佳实践
猜你喜欢
【JS高级】js之闭包对象_04
【堡垒机小知识】硬件堡垒机是什么意思?其与云堡垒机有什么区别?
480-82(59、151)
hyperbench:plugin.Open(“./fabric“): plugin was built with a different version of package golang.
Google Cloud X Kyligence|如何从业务视角管理数据湖?
苹果官方降价的原因找到了,它也面临销量下滑乃至出现库存问题
EA&UML日拱一卒-活动图::Feature和StuctualFeature
第4章_2——视图的使用
kubernetes cks strace etcd
Vscode builds ESP32-C3 development environment
随机推荐
Pinia状态持久化
题目 1125: C语言训练-委派任务*
【论文阅读】Anomaly Detection in Video via Self-Supervised and Multi-Task Learning
Still developing SMS verification code login?Try it (one-click login with your phone number)
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...
基于变胞机构的移动机器人构型设计研究综述
Bika LIMS 开源LIMS集—— SENAITE的使用(分析/测试、方法)
1191. 家谱树
The 10,000-character long article reveals the secrets of Huawei's data governance system!
479-82(54、11)
2022开放原子全球开源峰会数据库分论坛圆满召开
工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘
593. 有效的正方形 : 简单几何运用题
PHP代码审计得这样由浅入深地学
验证二叉树的前序序列化[抽象前序遍历]
C51 存储类型与存储模式
通过二维顺序表实现杨辉三角
如何返回一个数字的所有质因数?
【堡垒机小知识】硬件堡垒机是什么意思?其与云堡垒机有什么区别?
The core principles of electronic games