简述@RequestBody和@RequestParam的区别 ?
@RequestBody和@RequestParam是Spring框架中处理HTTP请求参数的两种常用注解,它们在处理请求参数时有着明显的区别:
- 来源不同:@RequestParam注解用于接收来自requestHeader中,即请求头的参数,也可以用它来处理来自请求URL中的查询参数。而@RequestBody注解则用于接收来自requestBody中,即请求体的参数,一般用于处理非Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据。
- 处理的数据类型不同:@RequestParam可以接受简单类型的属性,也可以接受对象类型。它有三个配置参数:required表示是否必须,默认为true;defaultValue可设置请求参数的默认值;value为接收url的参数名(相当于key值)。而@RequestBody则通常用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的),一般使用在POST请求中。因为GET请求中没有HttpEntity,所以@RequestBody并不适用。
- 使用方式:在Content-Type为application/x-www-form-urlencoded的请求中,get方式中queryString的值和post方式中body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到。而@RequestBody处理HttpEntity传递过来的数据,在POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。
总的来说,@RequestParam和@RequestBody在处理HTTP请求参数时各有特点,主要区别在于它们的来源、处理的数据类型以及使用方式上。在实际使用中,需要根据具体的业务场景和需求来选择合适的注解。