当前位置: 首页 > 科技观察

如何传递和接收POST请求和GET请求的解析参数

时间:2023-03-15 13:57:59 科技观察

1.前言如何传递接口参数是每个项目都应该面对的问题,这与编程语言无关。2、GET请求GET请求一般用于向服务器请求数据。一般来说,目前有两种参数传递方式。多参数拼接这是我们最常见的参数传递方式。它的一般传参方式如下:GET/api/v1/user?name=felord.cn&age=18HTTP/1.1Host:localhost:8080规则是:参数与URI之间用问号隔开?,参数keyvalues用等号=连接,然后参数用连接符&拼接在一起,比如例子中的name=felord.cn&age=18。在SpringMVC中,这样的参数可以被对象接收:@GetMapping("/user")publicResturlEncode(Userparams){//params.name=felord.cn//params.age=18returnRestBody.okData(params);}上述方法中携带的参数也可以通过HttpServletRequest#getParameter(Stringkey)获取,但一般建议在ServletFilter中使用该方法,不要在接口中使用。SpringMVC拦截器底层获取参数也是这样实现的。但是我也发现很多人在界面上用这个不合理。此外,URL的长度是有限的。如果GET请求中包含过于复杂的参数组合,说明业务设计有问题。路径识别参数的另一种方式是路径参数。该参数是期望数据的标识,一般是数据或分页参数的唯一标识。例如查询ID为1的用户:GET/api/v1/user/1HTTP/1.1Host:localhost:8080查询第一页用户(每页10条):GET/api/v1/users/1/10HTTP/1.1Host:localhost:8080在SpringMVC中,这个参数需要通过@PathVariable处理:@GetMapping("/user/{userId}")publicResturlEncode(@PathVariable("userId")StringuserId){returnRestBody.okData(userId);}DELETE请求也推荐使用路径参数3.POST/PUT请求GET请求是从服务器获取数据,POST请求是向服务器发送数据。很多不知道它们区别的同学会把它们搞混。我见过GET请求修改数据,POST请求查询结果。虽然它们都可以完成预期的工作,但是它们之间还是有很大的区别的,这里不得不重复一下:GET请求可以在浏览器中直接请求,当然会保留在浏览器历史记录中,而POST则不能。GET请求本质上是幂等的,而POST则不是。GET请求会被浏览器主动缓存,但是POST不会,除非手动设置。GET请求只能进行URI编码,而POST支持多种编码。对于参数的数据类型,GET只接受ASCII字符,而POST没有限制。GET不如POST安全,因为参数直接暴露在URL上,不能用于传递敏感信息。GET参数通过URL传递,有长度限制,POST放在请求体中,没有长度限制。GET请求会把请求头和DATA一起发送,然后服务器响应;对于POST请求,会先发送请求头,告诉服务端请求的编码方式等,然后服务端回复100continue,然后客户端将编码后的DATA发送给服务端,服务器响应。另外,如果不使用HTTPS,POST请求也无法保证数据的安全传输。表单提交POST请求最常用的场景就是表单提交,比如login:Firstname:
Lastname:
该方法是POST的默认方法,Content-Type为application/x-www-form-urlencoded。示例如下:POST/loginHTTP/1.1Host:localhost:8080Content-Type:application/x-www-form-urlencodedusername=felord.cn&password=felord.cn参数的组织方式参考GET请求,但是是不放在URL中,而是放在请求正文中,Content-Type必须明确声明为application/x-www-form-urlencoded。在SpringMVC中,我们可以直接使用对象接收:@PostMapping("/login")publicRestdoLogin(LoginDTOparams){//params.username=felord.cn//params.password=felord.cnreturnRestBody.okData(params);}以上登录也可以使用multipart/form-data方式请求:POST/loginHTTP/1.1Host:localhost:8080Content-Type:multipart/form-data;boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW----WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition:form-data;name="username"felord.cn----WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition:form-data;name="password"felord.cn----WebKitFormBoundary7MA4YWxkTrZu0gWmultipart/form-data将分别输入form转换为按边界划分的小格式,不转码,直接将UTF-8字节拼接到请求体中,实际上本地有多少字节就发送多少,效率大大提高,适合长字传输段,通常我们用于上传大字节,例如文件。比如我们上传路径C:/Users/felord/Desktop/spring-security.pdf文件到服务器,以myFile为标识名:POST/foo/uploadHTTP/1.1Host:localhost:8080Content-Type:multipart/form-data;boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW----WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition:form-data;name="myFile";filename="/C:/Users/felord/Desktop/spring-security.pdf"Content-Type:application/pdf(data)----WebKitFormBoundary7MA4YWxkTrZu0gW对应SpringMVC接口:@PostMapping("/upload")publicResturlEncode(@RequestPart("myFile")MultipartFilefile){StringoriginalFilename=file.getOriginalFilename();returnRestBody.okData(originalFilename);}请注意,默认的SpringMVC文件大小为10485760字节。目前AjaxPOST请求大多是前后端分离的,所以除了上传之外的POST请求更推荐将数据以JSON的形式提交给服务器。当我们需要添加一个名字为felord,年龄为18岁的User时,建议这样做:POST/user/addHTTP/1.1Host:localhost:8080Content-Type:application/json{"name":"felord","age":18}将参数封装为JSON,放入请求体中提交给后端。@PostMapping("/user/add")publicRestadd(@RequestBodyUseruser){returnRestBody.okData(user);}4.总结这篇文章的目的是为了厘清GET和POST的使用场景和参数传递方式,帮助大家正确使用,避免混淆方式带来的参数传递和解析问题。好了,今天就到这里,多多关注:码农小胖,获取更多编程干货。本文转载自微信公众号“码农小胖哥”,可通过以下二维码关注。转载本文请联系码农小胖公众号。