在控制器里,使用@RequestParam可以将请求参数绑定到方法参数。如:< class="ttyprint">
@Controller@RequestMapping("/pets")@SessionAttributes("pet")public class EditPetForm { // ... @GetMapping public String setupForm(@RequestParam("petId") int petId, ModelMap model) { Pet pet = this.clinic.loadPet(petId); model.addAttribute("pet", pet); return "petForm"; } // ...}
>
使用@RequestParam的参数默认是必须提供的,不过也可以指定其为可选的,将@RequestParam的reqired属性设置false即可。如,@RequestParam(value="id", required=false))
。
如果方法参数的类型不是String,如上例中的是int,类型转换会自动执行。
如果将@RequestParam用于Map
@RequestBody映射请求体
@RequestBody注解参数表示该参数将与HTTP请求体绑定。如:
< class="ttyprint">
@PutMapping("/something")public void handle(@RequestBody String body, Writer writer) throws IOException { writer.write(body);}
>
使用HttpMessageConverter将请求体转换为方法参数。HttpMessageConverter负责将请求信息转换为指定对象和将指定对象转换为请求体。RequestMappingHandlerAdapter默认支持@RequestBody使用以下HttpMessageConverters。
- ByteArrayHttpMessageConverter 转换为字节数组。
- StringHttpMessageConverter 转换为字符串。
- FormHttpMessageConverter 表单数据与 MultiValueMap
@ResponseBody映射响应体
@ResponseBody注解用在方法上,用来表示直接将返回数据写到HTTP响应体里。这样返回的数据不会放到Model中,也不会解析为视图名称。如:
< class="ttyprint">
@RequestMapping(value = "/something", method = RequestMethod.PUT)@ResponseBodypublic String helloWorld() { return "Hello World";}
>
上述例子会将Hello World文本写到HTTP响应流中。
与@RequestBody一样,Spring使用HttpMessageConverter将返回对象转换为响应体。
@RestController创建REST控制器
有时我们会将控制器实现REST API,只会返回JSON、XML或其他自定义媒体类型。那我们就可以在控制器上添加@RestController注解,而不用在每一个@RequestMapping上使用@ResponseBody。
@RestController是一个结合了@ResponseBody和@Controller的注解。
HttpEntity
HttpEntity的用法类似于@RequestBody和@ResponseBody注解。除了可以访问请求/响应体,HttpEntity(和专门用于响应的子类ResponseEntity)还可以访问request和response的头字段。如:
< class="ttyprint">
@RequestMapping("/something")public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException { String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader")); byte[] requestBody = requestEntity.getBody(); HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.set("MyResponseHeader", "MyValue"); return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);}
>
上述例子获取了MyRequestHeader头字段的值,以字节数组的形式读取了请求体,随后将MyRequestHeader添加到response,将Hello World写到响应流并设置响应状态码为201(Created)。
与@RequestBody和@ResponseBody一样,Spring使用HttpMessageConverter将数据与请求/响应流互转。