如何检索传递给 Spring Boot POST API 的原始 JSON 有效负载?



我正在做一个Spring Boot项目,在这个项目中,我必须开发一个处理POST请求的API,其中包含一个JSON有效负载。

我正在寻找此示例文档: https://www.baeldung.com/spring-resttemplate-post-json

其中完成:

@PostMapping(
value = "/createPerson", consumes = "application/json", produces = "application/json")
public Person createPerson(@RequestBody Person person) {
return personService.saveUpdatePerson(person);
}

根据我的理解,这个 API 期望在请求正文中有一个 JSON 有效负载(因为我将consumptions = "application/json">放入@PostMapping注释中(,该有效负载将自动转换为Person类的实例。

这个推理正确吗?

如果我的推理是正确的,我有一个疑问:我的具体用例非常不同:我的 API 不知道哪种对象代表 JSON 有效负载(例如,它可能是动物事物(。因此,API 无法确定在哪种对象中序列化收到的 JSON。

所以我想做的是:

  1. API 必须以某种方式接收原始 JSON 有效负载。
  2. 根据 JSON 内容,它会创建适当的对象(例如Person的实例或Animal的实例(。

这可能是一个聪明的解决方案? 我该怎么做才能检索原始 JSON 有效负载?

选项 1:Map<String, Object>

如果您只需要 JSON 字符串,请使用 Map 而不是 Person。这样就不会发生从 JSON 到对象的转换。

@PostMapping(value = "/createPerson", consumes = "application/json", produces = "application/json")
public Map<String, Object> createPerson(@RequestBody Map<String, Object> json) {
// Do whatever you want to do
}

如您所见,此方法还返回一个 Map,因此您也可以返回一个 JSON 字符串

选项 2:字符串

您也可以使用字符串。确保"消耗"设置为"MediaType.ALL_VALUE

@PostMapping(value = "demo", consumes = MediaType.ALL_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public String createPerson(@RequestBody String json) {
// Do whatever you want to do
return json;
}

尝试使用HttpEntity将原始正文作为字符串获取,然后将其转换为自定义对象:

@PostMapping(value = "/createPerson", consumes = "application/json", produces = "application/json")
public Person createPerson(HttpEntity<String> httpEntity) {
String body= httpEntity.getBody();
// convert your String to Person object or what ever using ObjectMapper
// ...
return personService.saveUpdatePerson(person);
}

最新更新