美文网首页jersey
Java开发RESTful(五)SpringMVC开发中

Java开发RESTful(五)SpringMVC开发中

作者: 叩丁狼教育 | 来源:发表于2018-01-21 11:31 被阅读179次

    【原创文章,转载请注明原文章地址,谢谢!】

    本节中,我们将详细的来看看@RequestMapping中关于REST相关的属性及使用。

    method

    上一篇文章中,已经提到过method属性,该属性用于限制一个方法能够处理的请求类型。如果不匹配该设置的请求类型,则返回405异常。另外需要注意一点的就是,虽然不建议使用,但是method属性是允许添加多种请求方式的:

    @RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})
    

    但是建议遵循REST规范,一个方法尽量使用一种请求方式。

    params

    在@RequestMapping中,可以通过params参数来限制,只有在参数中匹配某个参数的时候,才能映射到该方法中。虽然该参数和REST没有太大关系,我们还是简单举例说明:

    @GetMapping
    public List<Employee> list(){
        List<Employee> emps = new ArrayList<>();
        emps.add(new Employee(1L, "emp1"));
        emps.add(new Employee(2L, "emp2"));
        return emps;
    }
    
    @GetMapping(params="method=one")
    public List<Employee> listByCondition(){
        List<Employee> emps = new ArrayList<>();
        emps.add(new Employee(1L, "emp1"));
        return emps;
    }
    

    比如上面两个方法,我们让两个方法都使用employees这个资源,按照SpringMVC的规定,两个方法映射相同的路径在启动会报错,但是因为我们第二个方法设置了params属性,启动不会报错。
    产生的效果是,如果我们URL请求为:localhost:8082/employees,得到的结果是:


    image.png

    如果我们URL请求为:localhost:8082/employees?method=one,得到的结果是:


    image.png
    这个参数在多个请求在逻辑上属于同一个资源,但是根据某个请求条件执行不同的业务逻辑的时候非常有用,比如示例中的,我们的员工资源就是employees,那我们怎么区分是列出所有员工,还是列出匹配某个条件的员工。

    headers

    headers属性和params差不多,headers是限定要处理请求的请求头信息,只有匹配该请求头内容的请求,才会被该方法处理。举例说明:

    @RequestMapping(value = "/something", headers = "content-type=text/*")
    

    那么该方法就只匹配请求MIME类型为text/*的请求。说到这里,马上有童鞋就能联想到,我们在REST概念中说到,如果客户端需要请求不同格式的数据,比如XML或者JSON格式,可以通过header来处理。那么这里的headers属性就可以帮我们完成这个需求。如下示例:

    @GetMapping(value = "{id}",headers="Content-Type=application/json")
    public Employee getEmp(@PathVariable("id") Long id) {
        return new Employee(id, "emp");
    }
    
    @GetMapping(value="{id}",headers="Content-Type=text/xml")
    public Employee getEmpXml(@PathVariable("id") Long id,HttpServletResponse response){
        return new EmployeeXMLVO(id,"emp");
    }
    

    如上,当我们请求头中,包含了Content-Type="application/json"的时候,第一个方法会执行,返回json格式的Employee数据,而当请求头中,包含了Content-Type="text/xml"的时候,第二个方法会执行,返回xml格式的Employee数据。

    consumes

    但是由于在REST应用中,大量的会根据请求的Content-Type来选择返回视图内容,所以,在@RequestMapping中专门提供了一个consumes属性。consumes属性用于指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
    那么上面的例子可以简化为:

    @GetMapping(value = "{id}",consumes="application/json")
    public Employee getEmp(@PathVariable("id") Long id) {
        return new Employee(id, "emp");
    }
    
    @GetMapping(value="{id}",consumes="text/xml")
    public Employee getEmpXml(@PathVariable("id") Long id,HttpServletResponse response){
        return new EmployeeXMLVO(id,"emp");
    }
    

    produces

    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

    @Controller
    @GetMapping(value = "/pets/{petId}",produces="application/json")
    @ResponseBody
    public Pet getPet(@PathVariable String petId, Model model) {    
        // implementation omitted
    }
    

    方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json;

    至此,@RequestMapping注解上重要的属性已经介绍完毕,在REST开发中,可能用的比较多的是method,headers,consumers和produces这四个属性。

    WechatIMG7.jpeg

    相关文章

      网友评论

        本文标题:Java开发RESTful(五)SpringMVC开发中

        本文链接:https://www.haomeiwen.com/subject/cpbtaxtx.html