1. 前言

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

2. GET 请求

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

多参数拼接

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

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

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

@GetMapping("/user")
public Rest<?> urlEncode(User params) {// params.name = felord.cn// params.age = 18return RestBody.okData(params);
}

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

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

路径标识参数

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

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

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

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

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

@GetMapping("/user/{userId}")
public Rest<?> urlEncode(@PathVariable("userId") String userId) {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 请求最长使用的场景是表单提交,比如登录:

<form action="/login" method="POST">First name: <input type="text" name="username"><br>Last name: <input type="password" name="password"><br><input type="submit" value="登录">
</form>

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

POST /login HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencodedusername=felord.cn&password=felord.cn

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

@PostMapping("/login")
public Rest<?> doLogin(LoginDTO params) {// params.username = felord.cn// params.password = felord.cnreturn RestBody.okData(params);
}

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

POST /login HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"felord.cn
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="password"felord.cn
----WebKitFormBoundary7MA4YWxkTrZu0gW

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

POST /foo/upload HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="myFile"; filename="/C:/Users/felord/Desktop/spring-security.pdf"
Content-Type: application/pdf(data)
----WebKitFormBoundary7MA4YWxkTrZu0gW

对应的 Spring MVC 接口为:

    @PostMapping("/upload")public Rest<?> urlEncode(@RequestPart("myFile") MultipartFile file) {String originalFilename = file.getOriginalFilename();return RestBody.okData(originalFilename);}

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

Ajax POST 请求

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

POST /user/add HTTP/1.1
Host: localhost:8080
Content-Type: application/json{"name": "felord","age": 18
}

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

@PostMapping("/user/add")
public Rest<?> add(@RequestBody User user) {return RestBody.okData(user);
}

4. 总结

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

使用Sentinel对Spring MVC接口进行限流

RabbitMQ是如何确定消息是否投递到队列中的

POST请求和GET请求如何传递和接收解析参数相关推荐

  1. iOS开发网络篇—GET请求和POST请求

      一.GET请求和POST请求简单说明 创建GET请求 1 // 1.设置请求路径 2 NSString *urlStr=[NSString stringWithFormat:@"http ...

  2. mvc ajax get请求,springMVC 中 ajax get 请求和 post 请求的坑以及参数传递

    1, ajax 请求 无论为 post ,或者 get ,url中带有?形式的参数,后台都能以String类型变量接收,变量名称和参数名称必须一致 前台ajax: $.ajax( "prod ...

  3. WEB中get请求和post请求的区别

    参考:https://blog.csdn.net/weixin_39361808/article/details/81136865 GET请求和POST请求是HTTP协议发送请求的两种基本方法. W3 ...

  4. JSP、Servlet中get请求和post请求的区别总结

    在学习JavaWeb最初的开始阶段,大家都会遇到HttpServlet中的doGet和doPost方法.前两天看<Head First Servlets & JSP>看到其中讲关于 ...

  5. java中的post的作用,JSP、Servlet中get请求和post请求的区别总结

    在学习JavaWeb最初的开始阶段,大家都会遇到HttpServlet中的doGet和doPost方法.前两天看<Head First Servlets & JSP>看到其中讲关于 ...

  6. 客户端(前端)Ajax中Get请求和Post请求的区别

    我们在使用Ajax时,当我们向服务器发送数据时,我们可以采用Get方式请求服务器,也可以使用Post方式请求服务器.那么,Get请求和Post请求的区别到底在哪呢?  GET请求  get是最常见的请 ...

  7. 傲娇大少之——【GET请求和POST请求】

    若有来生,不婚不嫁,不孕不养,不做谁的妻,不为谁的娘. 只做自家女,养父母终老. 孑然一身,我行我素,随心所欲! ~诶,我好像不用等到来生... 关于http协议的get和post请求 get和pos ...

  8. get请求和post请求的区别(简洁易懂)

    一.GET和POST是什么? HTTP协议中的两种发送请求的方法,本质上都是在进行TCP连接. 二. GET请求和POST请求的区别是什么? GET请求参数是通过URL进行传递的,POST请求的参数包 ...

  9. GET请求和POST请求详述

    GET请求和post请求 一.GET请求 1.什么是GET请求 2.使用GET方法的具体情况 3.GET方式提交数据特点 二.POST请求 1.什么是POST请求 2.使用POST方法的具体情况 3. ...

最新文章

  1. 人工智能时代的“认知劳动”
  2. python开多少进程合适_用了python多进程,我跑程序花费的时间缩短了4倍
  3. ZooKeeper安装过程
  4. SAP Spartacus org unit页面的三种focus border及细节讨论
  5. phpst安装memcache扩展_在 Ubuntu/Debian 下安装 PHP7.3 教程
  6. python类初始化导入库_Python中optparser库用法实例详解
  7. 【ESSD技术解读-04】ESSD Auto PL规格,引领IO性能弹性新方向
  8. ida 字符串查找_IDA 搜索中文字符串
  9. 关于H3 BPM数据库如何实现排序取数据的问题
  10. nuc8 黑苹果_萝莉的身材野兽的心——NUC8 MacOS黑苹果-Win10双系统体验
  11. 第 1 章 FreeBSD Install
  12. [转载] python跨行 print:多用(),换行符\要小心,少用+或者不用(其它程序代码跨行用\就行,不能用括号)
  13. 通通玩blend美工(3)——可爱的云
  14. greenDao的使用教程
  15. 逆水寒捏脸服务器维护,逆水寒捏脸数据分享_全职业捏脸数据一览
  16. WordPress 前端投稿/编辑发表文章插件 DJD Site Post(支持游客和已注册用户)汉化版 免费下载...
  17. STM32 IO 简介
  18. 安卓系统 samba服务器搭建,介绍在电脑上建samba服务器的方法 安卓samba服务器的安装方法...
  19. 微信小程序编辑器,支持wxss,支持wxml
  20. 遗传算法 商旅问题 c++ GA tsp

热门文章

  1. sql语句常见错误:Unknown column 'xxx' in 'where clause该如何解决?
  2. Enumeration
  3. 什么是值传递,什么是引用传递
  4. Android自定义九宫格密码解锁
  5. 正则表达式替换字符串中的${}里面的数据
  6. 飞思卡尔 S12 (X)串口下载移植
  7. Flink反压如何排查
  8. 单片机学习和应用百问大全
  9. 分段存储管理+逻辑地址转化为物理地址+例题
  10. shell-awk命令详解