责编:顶级算法 | 来源:juejin.im/post/6860253625030017031
上一篇精彩:一年阿里算法工程师的工作总结
大家好,我是顶级算法。 从一道面试题说起: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-AlivePOST 请求长这样:
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(我用的版本是 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.
❞总结
作为面试题的话,本题大概有两个考点:
二进制图片序列化 base64; 特定场景的 url 长度限制。 部分 http 协议知识。 或者说,真要 get 传图片作为方案的话,需要打通上面两个关键技术问题。面试现场也可以再加一些Blob、TypedArray、图片压缩方案之类的。
排序序列: 1、程序员必知必会的排序一:冒泡排序 2、程序员必知必会的排序二:快速排序 3、程序员必知必会的排序三:直接插入排序 4、程序员必知必会的排序四:希尔排序 5、程序员必知必会的排序五:拓扑排序 6、程序员必知必会的排序六:选择排序 7、程序员必知必会的排序七:归并排序 8、程序员必知必会的排序八:基数排序 9、程序员必知必会的排序九:堆排序
觉得不错?欢迎转发分享给更多人
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 10T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!
👆扫码回复【面试题】即可获取👆
「顶级算法」建立了读者算法交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。
扫描添加好友邀你进算法群,加我时注明【姓名+公司+职位】
版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
往日分享:
如何有效地做算法题? 字节跳动面试经验总结,已顺利拿到offer! 一位大佬用了算法刷题宝典,进阿里了! 迷你天猫商城系统(附源码),改改就能接外包换钱! 五大基本算法之分治算法 算法分析的正确姿势 这些书,真tm肝…… CTO 写的代码,真是绝了 策略模式-短信模板业务场景 比冒泡算法还简单的排序算法:看起来满是bug的程序,居然是对的 吴恩达,新冠阳性!