曾经遇到的字节面试题,觉得挺有意思,请求来说下我的传图答案及思考过程。 首先,片蒙我们要知道的字节是,图片一般有两种传输方式:base64和file对象。请求 图片的传图base64编码想必大家都见过: base64的本质是字符串,而GET请求的片蒙参数在url里面,所以直接把图的字节base64数据放到url里面,就可以实现GET请求传图片。请求 input输入框拿到的传图图是file对象,图片file对象转base64: 问题来了,GET请求的字节url长度是有限制的,不同的请求浏览器长度限制不一样,最长的传图大概是 10k 左右,根据base64的编码原理,站群服务器base64图片大小比原文件大小大 1/3,所以说base64只能传一些非常小的小图,大图的base64太长会被截断。 但其实这个长度限制是浏览器给的,而不是GET请求本身,也就说,在服务端,GET请求长度理论上无限长,也就是可以传任意大小的图片。 我们来看看这个场景: 选择图片,然后提交表单,能提交成功,但是接口收不到文件。请求的url会变成http://localhost:8080/?logo=xxx.png,但是不会携带图片数据。正常情况,file对象数据是放在POST请求的body里面,并且是form-data编码。 推荐一个 Spring Boot 基础教程及实战示例:https://github.com/javastacks/spring-boot-best-practice 那么GET请求能否有body体呢? 答案是可以有。源码库 GET和POST并没有本质上的区别,他们只是HTTP协议中两种请求方式,仅仅是报文格式不同(或者说规范不同)。 做过底层开发的同事可能比较熟悉,之前我们C语言的同事和我讲,我们的HTTP请求,他们收到是这样子的: 举个栗子, 一个普通的 GET 请求,他们收到是这样的: POST 请求长这样: 同样,DELETE、PUT、PATCH请求,也都是这样的报文。底层解析这个报文的时候,并不关心是什么请求,所以说GET请求也可以有body体,也可以传form-data数据。 有兴趣的可以拿 postman 试一下,云南idc服务商看看GET请求传图片,接口能不能收到图片文件: 综上所述,GET 请求是可以传图片的,但是 GET 和 POST 的规范还是要遵守的,如果有后台让你这么做,锤他就行了!
前言
base64 图片
file 对象
结尾