请求过程中的那些事 请求参数处理 普通参数

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

请求参数处理

请求映射

之前我们定义路径使用getUser这种风格的,但是当路径多了之后就会显得十分麻烦,现在我们使用新的风格去开发,Rest的方式(使用HTTP请求方式动词来表示对资源的操作)

例如

/user GET-获取用户 DELETE-删除用户

多余的我们就不展示了,就简单举两个例子

1
2
3
4
5
6
7
8
9
typescript复制代码 	@RequestMapping(value = "/user",method = RequestMethod.GET)
public String getUser(){
return "GET-用户";
}

@RequestMapping(value = "/user",method = RequestMethod.POST)
public String saveUser(){
return "POST-用户";
}

因为不想写前端页面了,所以直接使用Postman进行测试,效果都是一样的

)

可以看我们的路径是一样的,但是我们请求的方式不同,我们的得到的反馈就不同

如果是写页面测试的小伙伴,可能会遇到一个问题,就是除了get和post这两种方式好使以外,其他的请求方式不好使,这时候在method="post",下面再加上一个隐藏参数,<input name="_method" type="hidden" type="xxx",这样子做就可以了

当我们使用不同方式请求的时候,就会显得很麻烦,他就有一种新的注解@GetMapping("/user")

映射原理

SpringBoot自动配置欢迎页的 WelcomePageHandlerMapping。访问/能访问到index.html;

SpringBoot自动配置了默认的 RequestMapping

请求进来,挨个尝试所有的HandlerMapping看是否有请求信息。

  • 如果有就找到这个请求对应的handler …如果有就找到这个请求对应的处理器
  • 如果没有就是下一个 HandlerMapping …如果没有就是下一个处理映射

我们需要一些自定义的映射处理,我们也可以自己给容器中放HandlerMapping。

1
2
3
4
5
6
7
8
9
10
11
kotlin复制代码	protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}

普通参数

我们传参的方式主要有四种

注解

使用@RequestParam,我们可以通过路径的方式去获取信息

1
2
3
4
5
6
typescript复制代码 	@GetMapping("/car/{id}")
public Map<String,Object> getCar(@PathVariable("id") Integer id){
Map<String,Object> map = new HashMap<>();
map.put("id",id);
return null;
}

其中的ID我们就可以通过指定的路径去获取

我们可以这样一个一个去获取值,也可以使用一个Map,都收集起来

1
2
3
4
5
6
7
8
9
10
11
less复制代码	@GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> getCar(@PathVariable("id") Integer id,
@PathVariable("username") String name,
@PathVariable Map<String,String> pv){
Map<String,Object> map = new HashMap<>();
map.put("id",id);
map.put("name",name);
map.put("pv",pv);

return map;
}

我们的测试工具还是postman

小插曲

postman官网下载地址

www.postman.com/downloads/

postman汉化包

github.com/hlmd/Postma…

我们只需要将汉化包放在postman的文件夹下

C:\Users\79367\AppData\Local\Postman\app-9.1.5\resources

上面是我的路径

回归正题,我们可以使用注解去获取请求头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
less复制代码	@GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> getCar(@PathVariable("id") Integer id,
@PathVariable("username") String name,
@PathVariable Map<String,String> pv,
@RequestHeader("User-Agent") String userAgent,
@RequestHeader Map<String,String> herder){
Map<String,Object> map = new HashMap<>();
map.put("id",id);
map.put("name",name);
map.put("pv",pv);
map.put("userAgent",userAgent);
map.put("headers",herder);


return map;
}

使用HttpServletRequest request可以将信息传到域中

1
2
3
4
5
typescript复制代码	@GetMapping("/goto")
public String geto(HttpServletRequest request){
request.setAttribute("msg","111");
return "s";
}

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%