Intro
本文暂不讨论不同的HTTP请求方法,只对前端向后端传递参数的方式进行测试总结。
前端向后端传递参数的4条路径:
- 路由变量
@PathVariable
- 请求参数
@RequestParam
- 请求体
@RequestBody
- 请求头(如Cookie就是一个很著名请求头,用于传递sessionid信息)
三个注解表示使用SpringMVC
对应的接收方式。
Java demo
- 后端web层接口:
该web接口会将从不同途径接收到的参数打印出来(作为响应数据返回给前端)。
@RestController
@RequestMapping(path = "/test")
public class FunctionTestController {
@PostMapping("/testArgs/{id}")
public Map<String, Object> testArgs(
HttpServletRequest request,
@PathVariable("id") String id,
@RequestParam("name") String name,
@RequestParam("age") String age,
@RequestBody User user
) {
Map<String, Object> result = new HashMap<>();
result.put("查询参数对:", name + age);
result.put("请求体:", user);
result.put("路由参数:", id);
String header01 = request.getHeader("wuyujin1997-01");
String header02 = request.getHeader("wuyujin1997-02");
Cookie[] cookies = request.getCookies();
result.put("自定义请求头:", header01 + header02 + JSON.toJSONString(cookies));
return result;
}
}
-
前端请求发送
使用 postman模拟HTTP请求。- 设置请求头(Cookie是规范中的,后面两个是自己定义的)
- 设置请求参数
(postman中可以在Params中一对一对填,也可以直接在URL中手动拼接参数对)
- 设置请求头(Cookie是规范中的,后面两个是自己定义的)
-
路由变量
见URL中对应位置的 123
@PostMapping("/testArgs/{id}")
@PathVariable("id") String id,
post localhost:8080/test/testArgs/123?name=111&age=bbb
中123
占据了id
的位置,会被服务端解析为id的值。 -
设置请求体
设置步骤:Body
-->raw
--> 右侧下拉菜单Text
切换为JSON (application/json)
(本次请求发送的是JSON格式)
然后运行,得到数据。
响应数据内容:
{
"查询参数对:": "aaabbb",
"请求体:": {
"gender": "男",
"subject": "软件工程"
},
"自定义请求头:": "11112222[{\"httpOnly\":false,\"maxAge\":-1,\"name\":\"a\",\"secure\":false,\"value\":\"1\",\"version\":0},{\"httpOnly\":false,\"maxAge\":-1,\"name\":\"b\",\"secure\":false,\"value\":\"2\",\"version\":0},{\"httpOnly\":false,\"maxAge\":-1,\"name\":\"c\",\"secure\":false,\"value\":\"333\",\"version\":0}]",
"路由参数:": "123"
}
其中自定义请求头部分,111
和222
为获取到的自定义的请求头的值(前端要和服务端提前约定好,才能这样通信),
后面部分为Cookie请求头的数据:
[
{
"httpOnly": false,
"maxAge": -1,
"name": "a",
"secure": false,
"value": "1",
"version": 0
},
{
"httpOnly": false,
"maxAge": -1,
"name": "b",
"secure": false,
"value": "2",
"version": 0
},
{
"httpOnly": false,
"maxAge": -1,
"name": "c",
"secure": false,
"value": "333",
"version": 0
}
]
Others
-
传送数据的方式
4种方式中,最常用的是查询参数对、请求体。
而路由变量较少见到(其实也就是服务端对URL的解析实现了这种规则而已,不止SpringMVC, express服务也实现了路由变量)
自定义请求头的话,Cookie就是一个很好的例子,用cookit请求头传递session相关的数据几乎是规范/约定。
而自定义其他请求头的话,不推荐。 -
自定义请求头
关于自定义请求头,已有先例:
X-Forwarded-For
X-Real-IP
这两个请求头是nginx服务器会加上的,用于记录调用链上的机器地址信息。
但并非标准的HTTP请求头(X表示 eXtension 扩展)
也就是说:我们完全可以通过自定义请求头来完成前后端通信,但不推荐。
- RESTful
是一种URL风格,可以更语义化地描述资源。
需要搭配不同的HTTP方法、路由变量,URL命名设计等,以遵循该规则。
见 https://wuyujin.blog.csdn.net/article/details/111658284