一个由POST和URL引发的一系列提问

我带着心中的“愤怒”,终于写完JAVA WEB作业。终于可以学点想学的只是啦,然后突然碰到了一个童鞋问的问题,结果发生了这是一个连锁反应。

POST方法可以用URL来传参吗

一个童鞋在群里提问说:“POST方法可以用URL来传参吗?”
然后我的第一反应是这个问题也太傻了吧,POST肯定是在主体里面传参呀!后面在群里说了几句,结果那位童鞋说,是面试官问他的问题,答案是可以。我本来就是个前端渣渣,经历后台也少,然后还那么肯定的说,瞬间就感觉好羞耻,马上就怂了。上网一搜发现有的人确实说可以,于是我就打开我的wireshark和网站开始实验。
一开始使用PHP,用POST方法去提交到一个带了参数的URL里面,结果是用$_POST只能获取到主体内的内容,用$_GET才能获取URL上的内容,查看报文也是,只有表单的内容放在主体里。
后面又用了JAVA,因为是用POST方法提交到Servlet去的,所以是调用了doPost方法,另外用getParameter()来获取数据结果显示的是URL上面的数据。后面查了一下很快就查到,它会优先去看GET里面的参数,如果有这个就不会再去看其他方法里有没有了。
所以这个结果,其实也知道,和我刚开始想的并没有很大的冲突,因为这种用URL带参数,本质上还是GET方法,所以说用POST方法来URL传参的说法并不严谨。

POST的数据一定要在表格里面吗

由于同时我还问了一些小伙伴,所以又有小伙伴问我,是不是POST方法只能用表单来实现?答案是否定的。在RFC文档里面只是规定了内容要放在主体上。后来我上网查询,发现POST提交的数据格式可以有下面几种:

  • application/x-www-form-urlencoded:最常见的表单提交数据格式
  • multipart/form-data:带有文件的表单提交方式
  • application/json:在Angular的Ajax提交用的就是这种方法
  • text/xml

那么用URL来传参的一定是GET方法吗

这是师傅对我发出的提问,答案显然也不是的,查看RFC 2616文档发现DELETE、PUT这些都是从URL里面来解析参数。那么师傅又开始想,什么情况下应该把内容放在主体里面,什么时候又应该把内容放在URL里面呢?可以得知一些方便操作的东西是可以放在URL里面的,比如翻页呀搜索呀之类的,这样用户也方面,最后师傅去看axios的源码来查看他使用delete方法,结果师傅也越走越远...不过他最后说:

后端的开发人员一般都会写一个方法获取url + body上的数据,再写两个方法一个专门用来获取url数据,一个专门用来获取body数据

结局

我们班的大神最后看到了multipart/form-data就想起了自己原来做安卓系统因为不知道它的存在,想了很久才把图片转编码传了上去。我想起自己原来写实训项目的时候也是用了base64编码,但是我做的是图片预览。然后他问我:“如果把一个txt文件改成jpg,你的网站也能提交成功吗?”然后我试了试,果然我没有处理这个BUG。后面上网查看发现有童鞋说,可以先把编码转成一个new Image再提取特征,看看是不是图片,也有童鞋说图片转成16机制有一段编码是完全相同的,可以靠这个来判断...然后在这个问题上越走越远了。

posted @ 2022-11-13 18:23  章鱼小年糕  阅读(42)  评论(0编辑  收藏  举报