前言中遇到的面试题我都被搞糊涂了,觉得还蛮有意思??的。说说我的回答和思考过程吧。首先,我们需要知道的是,图片的传输方式一般有两种:base64和文件对象。base64图片图片的base64编码想必大家都看过:base64的本质是字符串,GET请求的参数在url中,所以直接把图片的base64数据放在url中,而GET请求可用于传输图片。input输入框获取的图片是一个文件对象,图片文件对象转成base64://img参数:filefileorblobconstgetBase64=img=>{returnnewPromise((resolve,reject)=>{constreader=newFileReader();reader.onload=e=>{resolve(e.target.result);};reader.onerror=e=>reject(e);reader.readAsDataURL(img);})}问题是urlGET请求的长度是有限制的,不同的浏览器有不同的长度限制。最长的是10k左右。根据base64的编码原理,base64图片的大小比原文件大1/3,所以base64只能传输一些很小的图片。如果大图的base64过长,会被截断。但实际上这个长度限制是浏览器给定的,而不是GET请求本身。也就是说,在服务器端,GET请求长度理论上是无限大的,即可以传输任意大小的图片。文件对象让我们来看看这个场景:表单>选择图片,然后提交表单。提交成功,但是接口收不到文件。请求的url会变成http://localhost:8080/?logo=xxx.png,但是不会携带图片数据。通常,文件对象数据放在POST请求的正文中,并采用表单数据编码。推荐一个SpringBoot基础教程和实例:https://github.com/javastacks/spring-boot-best-practice那么GET请求可以有body吗?答案是肯定的。GET和POST没有本质区别。它们只是HTTP协议中的两种请求方式,只是报文格式不同(或者说规范不同)。做过底层开发的同事可能不陌生。之前我们C语言的同事跟我说,我们的HTTP请求,他们是这样接收的:比如一个普通的GET请求,他们是这样接收的:GET/test/?sex=man&name=zhangsanHTTP/1.1Host:http://localhost:8080Accept:application/json,text/plain,*/*Accept-Encoding:gzip,deflateAccept-Language:zh-CN,zh;q=0.9Connection:Keep-AlivePOST请求如下所示:POST/addHTTP/1.1Host:http://localhost:8080Content-Type:application/x-www-form-urlencodedContent-Length:40Connection:Keep-Alivesex=man&name=Professional同样,DELETE、PUT、PATCH请求也是这样的消息。底层在解析这个消息的时候,并不关心是什么请求,所以GET请求也可以有body,也可以传递form-data数据。有兴趣的可以用postman试试看GET请求能不能发图片,接口能不能接收图片文件:最后,上面说了GET请求可以发图片,但是GET和GET的规范仍然需要遵循POST。有后台让你这么干,直接锤他!