@RequestParam将请求参数绑定到方法参数
在控制器里,使用@RequestParam可以将请求参数绑定到方法参数。如:
@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请求体绑定。如:
@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中,也不会解析为视图名称。如:
@RequestMapping(value = "/something", method = RequestMethod.PUT)
@ResponseBody
public 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的头字段。如:
@RequestMapping("/something")
public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException {
String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader"));
byte[] requestBody = requestEntity.getBody();
// do something with request header and body
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将数据与请求/响应流互转。