@RequestBody和@RequestParam之间有什么区别?

时间:2015-01-20 07:20:06

标签: spring spring-mvc spring-boot servlet-3.0 http-request-parameters

我已经阅读了Spring文档以了解@RequestBody,他们给出了以下解释:

  

@RequestBody方法参数注释指示方法参数应绑定到HTTP请求正文的值。例如:

@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
  writer.write(body);
}
  

使用HttpMessageConverter将请求正文转换为方法参数。 HttpMessageConverter负责从HTTP请求消息转换为对象并从对象转换为HTTP响应主体。

     

DispatcherServlet支持使用DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter进行基于注释的处理。在Spring 3.0中,AnnotationMethodHandlerAdapter已扩展为支持@RequestBody并默认注册了以下HttpMessageConverter

     

...

但我的困惑是他们在文档中写的句子

  

@RequestBody方法参数注释指示方法参数应绑定到HTTP请求主体的值。

他们的意思是什么?任何人都可以提供一个例子吗?

spring doc中的@RequestParam定义是

  

注释,指示应将方法参数绑定到Web请求参数。支持ServletPortlet环境中带注释的处理程序方法。

我在他们之间感到困惑。请帮我举一个例子,说明它们彼此之间的差异。

6 个答案:

答案 0 :(得分:63)

Caused by: java.util.zip.ZipException: invalid CEN header (bad signature) at java.util.zip.ZipFile.open(Native Method) at java.util.zip.ZipFile.<init>(Unknown Source) at java.util.zip.ZipFile.<init>(Unknown Source) at java.util.jar.JarFile.<init>(Unknown Source) at java.util.jar.JarFile.<init>(Unknown Source) at org.apache.catalina.webresources.JarResourceSet.initInternal(JarResourceSet.java:89) 带注释的参数会链接到特定的Servlet请求参数。参数值将转换为声明的方法参数类型。 此批注指示应将方法参数绑定到Web请求参数。

例如,Spring RequestParam的Angular请求看起来像这样:

@RequestParam
带有RequestParam的

端点:

$http.post('http://localhost:7777/scan/l/register?username="Johny"&password="123123"&auth=true')
      .success(function (data, status, headers, config) {
                        ...
                    })

@RequestMapping(method = RequestMethod.POST, value = "/register") public Map<String, String> register(Model uiModel, @RequestParam String username, @RequestParam String password, @RequestParam boolean auth, HttpServletRequest httpServletRequest) {... 带注释的参数会链接到HTTP请求正文。使用HttpMessageConverters将参数值转换为声明的方法参数类型。 此批注指示应将方法参数绑定到Web请求的主体。

例如,Spring RequestBody的Angular请求看起来像这样:

@RequestBody
带有RequestBody的

端点:

$scope.user = {
            username: "foo",
            auth: true,
            password: "bar"
        };    
$http.post('http://localhost:7777/scan/l/register', $scope.user).
                        success(function (data, status, headers, config) {
                            ...
                        })

希望这有帮助。

答案 1 :(得分:5)

@RequestParam注释告诉Spring它应该将请求参数从GET / POST请求映射到方法参数。例如:

请求:

GET: http://someserver.org/path?name=John&surname=Smith

端点代码:

public User getUser(@RequestParam(value = "name") String name, 
                    @RequestParam(value = "surname") String surname){ 
    ...  
    }

基本上,虽然@RequestBody将整个用户请求(甚至是POST)映射到一个String变量,@RequestParam使用一个(或更多 - 但更复杂)请求param到您的方法参数。

答案 2 :(得分:4)

@RequestParam使Spring将请求参数从GET / POST请求映射到方法参数。

获取请求

http://testwebaddress.com/getInformation.do?city=Sydney&country=Australia

public String getCountryFactors(@RequestParam(value = "city") String city, 
                    @RequestParam(value = "country") String country){ }

POST请求

@RequestBody使Spring将整个请求映射到模型类,并从那里可以从其getter和setter方法中检索或设置值。检查下面。

http://testwebaddress.com/getInformation.do

你有来自前端的JSON数据并点击你的控制器类

{
   "city": "Sydney",
   "country": "Australia"
}

Java代码 - 后端(@RequestBody

public String getCountryFactors(@RequestBody Country countryFacts)
    {
        countryFacts.getCity();
        countryFacts.getCountry();
    }


public class Country {

    private String city;
    private String country;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}

答案 3 :(得分:1)

非常简单,只需查看它们的名称@RequestParam,它由两部分组成,一个是“ Request”,这意味着它将处理请求,另一部分是“ Param”,这本身就意味着仅要映射对Java对象的请求参数。 与@RequestBody一样,它将处理已随请求到达的数据,例如,如果客户端当时已使用请求发送json对象或xml,则必须使用@requestbody。

答案 4 :(得分:0)

以下是@RequestBody的示例,首先看一下控制器!!

  public ResponseEntity<Void> postNewProductDto(@RequestBody NewProductDto newProductDto) {

   ...
        productService.registerProductDto(newProductDto);
        return new ResponseEntity<>(HttpStatus.CREATED);
   ....

}

这是角度控制器

function postNewProductDto() {
                var url = "/admin/products/newItem";
                $http.post(url, vm.newProductDto).then(function () {
                            //other things go here...
                            vm.newProductMessage = "Product successful registered";
                        }
                        ,
                        function (errResponse) {
                            //handling errors ....
                        }
                );
            }

简要介绍一下表格

 <label>Name: </label>
 <input ng-model="vm.newProductDto.name" />

<label>Price </label> 
 <input ng-model="vm.newProductDto.price"/>

 <label>Quantity </label>
  <input ng-model="vm.newProductDto.quantity"/>

 <label>Image </label>
 <input ng-model="vm.newProductDto.photo"/>

 <Button ng-click="vm.postNewProductDto()" >Insert Item</Button>

 <label > {{vm.newProductMessage}} </label>

答案 5 :(得分:0)

映射HTTP请求标头Content-Type,处理请求正文。

  • @RequestParamapplication/x-www-form-urlencoded

  • @RequestBodyapplication/json

  • @RequestPartmultipart/form-data