请求过程中的那些事

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

请求参数处理

请求映射

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

例如

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

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

 	@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。

	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,我们可以通过路径的方式去获取信息

 	@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,都收集起来

	@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

上面是我的路径

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

	@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可以将信息传到域中

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

おすすめ

転載: juejin.im/post/7032266919570833439