@RequestBody和@RequestParam有什么区别?


76

我遍历了Spring文档以了解@RequestBody,他们给出了以下解释:

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

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

您可以通过使用将请求主体转换为方法参数HttpMessageConverterHttpMessageConverter负责从HTTP请求消息转换为对象,并从对象转换为HTTP响应主体。

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

...

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

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

那是什么意思?谁能给我一个例子吗?

@RequestParamspring doc中的定义是

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

我对他们感到困惑。请帮我举个例子,说明它们之间的区别。



5
@kryger。这不是重复的,因为我已经进行了研究,因此我已经阅读了Spring文档。我要求提供示例。我给了您定义。我想举例说明它们之间的区别。以上问题对此没有提供足够的解释,因此我认为不应对此予以否决。
Manoj Singh 2015年

Answers:


89

@RequestParam带注释的参数链接到特定的Servlet请求参数。参数值将转换为声明的方法参数类型。该注释指示方法参数应绑定到Web请求参数。

例如,对Spring RequestParam(s)的角度请求如下所示:

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

带有RequestParam的端点:

@RequestMapping(method = RequestMethod.POST, value = "/register")
public Map<String, String> register(Model uiModel,
                                    @RequestParam String username,
                                    @RequestParam String password,
                                    @RequestParam boolean auth,
                                    HttpServletRequest httpServletRequest) {...

@RequestBody带注释的参数链接到HTTP请求正文。使用HttpMessageConverters将参数值转换为声明的方法参数类型。此注释指示方法参数应绑定到Web请求的主体。

例如,对Spring RequestBody的Angular请求如下所示:

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

带有RequestBody的端点:

@RequestMapping(method = RequestMethod.POST, produces = "application/json", 
                value = "/register")
public Map<String, String> register(Model uiModel,
                                    @RequestBody User user,
                                    HttpServletRequest httpServletRequest) {... 

希望这可以帮助。


8

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

GET请求

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;
    }
}

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但将一个(或多个-但更复杂)请求参数映射到方法参数。


6
请举..RequestBody的示例
Manoj Singh,

5

映射HTTP请求标头Content-Type,处理请求主体。

  • @RequestParamapplication/x-www-form-urlencoded

  • @RequestBodyapplication/json

  • @RequestPartmultipart/form-data



2

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


1

这是@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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.