【问题标题】:Spring RequestBody with Postman testing带有 Postman 测试的 Spring RequestBody
【发布时间】:2020-05-30 03:10:04
【问题描述】:

我正在测试我的应用程序,我发现了一些奇怪的东西。

我的代码:

  @RequestMapping(value = "/test/{subscriberId}", method = RequestMethod.PATCH, consumes = "application/json", produces = "application/json")
public void test(@PathVariable final String subscriberId,@RequestBody Boolean actDeact ) {
..
}

当我通过邮递员提出请求时,我收到了 400 个错误请求:

但是当我在正文中只通过 true 时,一切正常:

我不明白为什么会这样。

我认为我的第一次尝试是有效的。如果我等待字符串,也会发生同样的情况 (我没有收到错误代码 400,但将字符串中的所有正文都传递给我)

谁能解释一下?

【问题讨论】:

  • 它适用于布尔值,因为您的 test() 方法中有“@RequestBody Boolean actDeact”,您应该将其更改为接受您将以 JSON 格式在 Postman 的请求正文中传递的任何对象跨度>

标签: java rest spring-mvc postman spring-annotations


【解决方案1】:

试试这样:

 public class MyPojo
    {
  private  Boolean actDeact;
  private  String subscriberId;
    // you can add it if you want more ..

    public Boolean getActDeact() {
        return actDeact;
    }

    public void setActDeact(Boolean actDeact) {
        this.actDeact = actDeact;
    }

   public String getSubscriberId() {
    return subscriberId;
   }
   public void setSubscriberId(String subscriberId) {
    this.subscriberId = subscriberId;
   } 
 }

@RequestBody MyPojo myPojo // 像这样使用它。

Spring 会将传入的 JSON 转换为来自 post body 的 MyPojo 对象(因为您添加了 @RequestBody 注释)并将返回的对象序列化为 JSON(因为您添加了 @ResponseBody 注释)。

你可以参考 https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc 了解更多。

注意:

@RequestParam 注释参数链接到特定的 Servlet 请求参数。参数值被转换为声明的 方法参数类型。这个注解表示一个方法 参数应绑定到网络请求参数。

@RequestParam 如果要发送,可以使用: String,Boolean 作为参数,不带包装器。

同样的方法

@RequestBody 注释参数链接到 HTTP 请求正文。 参数值被转换为声明的方法参数类型 使用 HttpMessageConverters。这个注解表示一个方法 参数应绑定到 Web 请求的正文。

所以你在哪里发送 true 这不是一个有方法的身体。 它无法工作或转换为 json 所以它会返回一些 400 状态码

400 Bad Request 响应代码的扩展。 如果您仍然需要了解更多信息,可以阅读文档 的弹簧。 我希望这可以帮助你.... 谢谢你。。

【讨论】:

  • 我知道如果我制作一个包装器,这将起作用。我只是想了解为什么字符串对象或布尔对象不必像对象一样在 json 中传递,而只需要传递值。
  • 我会更新并支持您的问题,顺便说明一下 spring 注释是如何工作的。
【解决方案2】:

布尔值的反序列化只是一个布尔值。例如:真的

如果你想以第一种方式接受参数,你应该通过一个dto对象来获取这个参数。

例子:

public class ActDeactDto {
    public boolean actDeact;
}

@RequestMapping(value = "/test/{subscriberId}", method = 
RequestMethod.PATCH, consumes = "application/json", produces = 
"application/json")
public void test(@PathVariable final String subscriberId, @RequestBody 
ActDeactDto actDeact ) {
..
}

【讨论】:

  • 我知道如果我制作一个包装器,这将起作用。我只是想了解为什么字符串对象或布尔对象不必像对象一样在 json 中传递,而只需要传递值。
  • 因为您使用 RequestBody 注释,这意味着“由该对象组成的请求主体”。布尔值本身不是 json 对象,它只是一个值。如果你想接受简单的值,去掉 RequestBody 注释或者只是将值作为请求负载发送。
【解决方案3】:

原则上,你应该检查HTTP方法的使用之间的一致性。在 Postman 中,您使用 POST,但在 RequestMapping 方法中使用 PATCH

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 2022-01-04
    • 1970-01-01
    • 2014-04-01
    • 2023-03-14
    • 2015-08-10
    • 1970-01-01
    • 2021-03-19
    • 2017-09-21
    相关资源
    最近更新 更多