URL QueryString与x-www-form-urlencoded和GET

问题提出

早年的时候就提出过这个问题,并且总结了一句话:“关于http请求x-www-form-urlencoded 格式当为GET请求时,参数就写在URL上,这个就叫做QueryString, GET请求没有body当为POST请求时,应该写在body里,但是Spring的话,POST请求写在URL也是能获取的到的。

分析与纠正
GET请求能带body?

实际上协议并没有约束说GET请求并不能有body,完全是可以用curl 发出来带body的GET请求,但是并不能保证所有Server都能处理,所以还是不建议这么做 https://stackoverflow.com/questions/978061/http-get-with-request-body,而且自己早先说的请求为GET时,参数就写在URL上,这个是自己认为应该这样发送,不是某个程序的自动行为,记住 HTTP URL和body完全是两个东西,所以x-www-form-urlencoded和参数在URL是两回事;并且对于后面的"经验",实质上是因为Spring能自动匹配所有参数,通过name从header、url等自动绑定请求k-v到函数参数名)。我今天遇到的是我们一个文档实例上说请求参数在body,并且content-Type是x-www-form-urlencoded 但是给的示例却是在URL上,实际上后端框架都是能正确处理的。正确的应该是在body用url编码

curl示例
客户端:curl -XGET localhost:8888/?a=b -d 'c=d'
服务端: nc -l 8888
GET /?a=b HTTP/1.1
Host: localhost:8888
User-Agent: curl/7.58.0
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded

c=d

如果你不带-XGET, 因为-d存在,curl会自动转为POST请求

form请求

那么form请求又是什么?首先,form是从哪里看到的?Postman!然后可以看Postman的实际发送命令,是curl 命令 -F (–form,参见man手册),指定了ContentTypemultipart/form-data, 所以formx-www-url-encoded没有任何关系
如果这个form是来自HTML的form表单概念,则有submit标签的默认发送的ContentTypeapplication/x-www-urlencoded 参见文档 https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/submit

你可能感兴趣的:(http)