Java开发RESTful(五)SpringMVC开发中
【原创文章,转载请注明原文章地址,谢谢!】
本节中,我们将详细的来看看@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