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

 1. 前言

接口参数应该怎么传递是每个项目应该面对的问题,这跟编程语言无关,今天来总结一波常用的接口参数传递方式。

2. GET 请求

GET 请求一般用来向服务器请求获取数据。总体来说目前有两种传参风格类型。

多参数拼接

这是我们最常见的传递方式,它一般传参方式如下:

 
 
 
 
  1. GET /api/v1/user?name=felord.cn&age=18 HTTP/1.1 
  2. Host: localhost:8080 

规则为:参数和 URI 之间用问号?隔开, 参数键值用等号=连接,然后参数之间用连接符&拼接起来,如样例中的name=felord.cn&age=18。在 Spring MVC 中这种参数可以被对象接收:

 
 
 
 
  1. @GetMapping("/user") 
  2. public Rest urlEncode(User params) { 
  3.     // params.name = felord.cn 
  4.     // params.age = 18 
  5.     return RestBody.okData(params); 

通过HttpServletRequest#getParameter(String key)也获取上述方式携带的参数,但是一般这种方式建议在 Servlet Filter 过滤器使用,而不建议在接口中使用。Spring MVC 拦截器获取参数的底层也是该方式实现的。但是我也发现很多人在接口中使用此不合理的方式。

另外 URL 的长度是有限制的,如果 GET 请求包含了过于复杂的参数组合,说明业务设计是有问题的。

路径标识参数

还有一种方式就是路径参数,这种参数是期望获取数据的标识,一般为数据的唯一标识或者分页参数。例如查询标识为1的用户:

 
 
 
 
  1. GET /api/v1/user/1 HTTP/1.1 
  2. Host: localhost:8080 

查询第1页(每页10条)的用户:

 
 
 
 
  1. GET /api/v1/users/1/10 HTTP/1.1 
  2. Host: localhost:8080 

在 Spring MVC 中这种参数需要通过@PathVariable来处理:

 
 
 
 
  1. @GetMapping("/user/{userId}") 
  2. public Rest urlEncode(@PathVariable("userId") String userId) { 
  3.     return RestBody.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 请求会先发送请求头告诉服务器请求的编码方式等等,然后服务器响应 100 continue 后客户端再把编码后的 DATA 发送给服务器,由服务器作出响应。另外如果不使用 HTTPS,POST 请求也无法保证数据的安全传输。

表单提交

POST 请求最长使用的场景是表单提交,比如登录:

 
 
 
 
  1.  
  2.     First name: 
     
  3.     Last name: 
     
  4.    
  5.  

这种方式是 POST 的默认方式,Content-Type为application/x-www-form-urlencoded。样例如下:

 
 
 
 
  1. POST /login HTTP/1.1 
  2. Host: localhost:8080 
  3. Content-Type: application/x-www-form-urlencoded 
  4.  
  5. username=felord.cn&password=felord.cn 

参数的组织方式参考 GET 请求,但是不是放在 URL 中而是放在请求体中,另外必须显式声明Content-Type为application/x-www-form-urlencoded。Spring MVC 中我们可以直接使用对象来接收:

 
 
 
 
  1. @PostMapping("/login") 
  2. public Rest doLogin(LoginDTO params) { 
  3.     // params.username = felord.cn 
  4.     // params.password = felord.cn 
  5.     return RestBody.okData(params); 

上面的登录也可以使用multipart/form-data方式来请求:

 
 
 
 
  1. POST /login HTTP/1.1 
  2. Host: localhost:8080 
  3. Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW 
  4.  
  5. ----WebKitFormBoundary7MA4YWxkTrZu0gW 
  6. Content-Disposition: form-data; name="username" 
  7.  
  8. felord.cn 
  9. ----WebKitFormBoundary7MA4YWxkTrZu0gW 
  10. Content-Disposition: form-data; name="password" 
  11.  
  12. felord.cn 
  13. ----WebKitFormBoundary7MA4YWxkTrZu0gW 

multipart/form-data将表单中的每个input转为了一个由boundary分割的小格式,没有转码,直接将 UTF-8 字节拼接到请求体中,在本地有多少字节实际就发送多少字节,极大提高了效率,适合传输长字节,通常我们用来上传文件等大字节。例如我们将路径C:/Users/felord/Desktop/spring-security.pdf文件以myFile为标识名上传到服务器:

 
 
 
 
  1. POST /foo/upload HTTP/1.1 
  2. Host: localhost:8080 
  3. Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW 
  4.  
  5. ----WebKitFormBoundary7MA4YWxkTrZu0gW 
  6. Content-Disposition: form-data; name="myFile"; filename="/C:/Users/felord/Desktop/spring-security.pdf" 
  7. Content-Type: application/pdf 
  8.  
  9. (data) 
  10. ----WebKitFormBoundary7MA4YWxkTrZu0gW 

对应的 Spring MVC 接口为:

 
 
 
 
  1. @PostMapping("/upload") 
  2.  public Rest urlEncode(@RequestPart("myFile") MultipartFile file) { 
  3.      String originalFilename = file.getOriginalFilename(); 
  4.      return RestBody.okData(originalFilename); 
  5.  } 

请注意 Spring MVC 文件大小默认是10485760bytes。

Ajax POST 请求

目前大部分都是前后端分离了,所以除了上传之外的 POST 请求更多建议将数据使用JSON的形式提交给服务器。当我们需要新增一个name为felord、age为18的User时建议这么做:

 
 
 
 
  1. POST /user/add HTTP/1.1 
  2. Host: localhost:8080 
  3. Content-Type: application/json 
  4.  
  5.     "name": "felord", 
  6.     "age": 18 

将参数封装为JSON并放入请求体提交给后端。

 
 
 
 
  1. @PostMapping("/user/add") 
  2. public Rest add(@RequestBody User user) { 
  3.     return RestBody.okData(user); 

4. 总结

本文的目的希望在于明确 GET 和 POST 的使用场景和传参方式,来帮助你正确使用它们,避免混乱的方式带来的参数传递和解析问题。好了今天就到这里,多多关注:码农小胖哥,获取更多编程干货。

 本文转载自微信公众号「码农小胖哥」,可以通过以下二维码关注。转载本文请联系码农小胖哥公众号。

新闻标题:POST请求和GET请求如何传递和接收解析参数
本文来源:http://www.hantingmc.com/qtweb/news34/326234.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联