如何仅将 JSON 请求正文的几个字段从 DTO 发布到 URL 春季启动

Posted

技术标签:

【中文标题】如何仅将 JSON 请求正文的几个字段从 DTO 发布到 URL 春季启动【英文标题】:How to POST only a few fields of JSON request body from a DTO to a URL spring boot 【发布时间】:2020-08-22 10:45:57 【问题描述】:

春季启动:

我有一个包含 4 个字段的 DTO。 “key1”:“value1”, “key2”:“value2”, “key3”:“value3”, “key4”:“value4”

我正在做一个 PostMapping(@RequestBody DTO dto)

我必须对在 POST 正文中只需要 key2、key3 和 key4 的 URL 进行 POST 调用。 key1 是 URI 的一部分,意思是:

发布到https://domain/app/"value1"/test/something POST 正文如下 “key2”:“value2”, “key3”:“value3”, “key4”:“value4”

有人可以帮助指导如何做到这一点。

【问题讨论】:

这应该无需更改即可工作。你有例外吗? 我收到“400 错误请求”,因为如果我修改我的 DTO 以使用正文“key2”:“value2”,“key3”:“ value3", "key4": "value4" ,它的工作原理。 但是我有 key1:value1 我在 POST URL 本身中使用它,所以我的帖子正文结构应该有我的同上减去 key1:value1 @SimonMartinelli 有时 API 提供者可以使用 F5 服务器为传入请求定义一组规则。它发生了 【参考方案1】:

创建另一个新的 DTO 对象,该对象应该只有必填字段,并使用 modelMapper 映射到您的新请求 DTO。

将此依赖项添加到您的 pom.xml(可能使用最新版本)

<dependency>
    <groupId>org.modelmapper.extensions</groupId>
    <artifactId>modelmapper-spring</artifactId>
    <version>2.3.0</version>
</dependency>

创建一个新的 dto

Class NewDto

 private String key2;
 private String key3;
 private String key4;

 //getters and setters

然后在控制器中

@PostMapping("") //add your entry point
public ResponseEntity<?> method(@RequestBody DTO dto)

 String key1 = dto.getKey1();
 ModelMapper mapper = new ModelMapper();
 NewDto newDto = mapper.map(dto, NewDto.class);

 //now this newDto contains only required fields
 // then use key1 in uri and add newDto to request body and call post URI


假设如果你愿意使用 ObjectMapper,你需要在属性上使用@JsonIgnore。但我会建议使用 ModelMapper。

【讨论】:

【参考方案2】:

你可以使用@PathVariable注解

PostMapping(@PathVariable("value1") String value1, @RequestBody DTO dto)

【讨论】:

谢谢,您能否提供一种从 dto 检索值并将其发送到 POST 调用 URI 的方法,并且只发送 "key2": "value2", "key3": "value3", " key4": "value4" 到 POST URL 作为正文。 在创建 URI 时,您可以从 dto 对象将值附加或添加到 URI 中。【参考方案3】:

网址可以是/topic/key1我不知道你为什么需要额外的/test/something 附加在此处。如果您愿意,您可以在路由中添加额外的 /test/something

注意: 这里的路由中的topic指的是控制器或者API的组名。

您可能已经创建了 TopicService 来处理杂乱无章的操作,如果您通过创建存储库从服务中使用 JPA hibernate,还可以进一步处理。

主题控制器可以处理带有spring注解的传入请求。

@RequestMapping 用于将适当的请求映射到此控制器方法。 您可以使用名为 RequestMethod 的 spring 枚举,其中包含不同类型的 HTTP 方法。 @RequestBody 使用(post 方法)传入请求的主体,在这种情况下,该主体被接受为包含 (key2, key3, and key4) 的主题。 您应该定义具有所有适当字段的 Topic 类 (DTO) 以及具有适当 crud 操作方法的 TopicService。

@RequestMapping(method = RequestMethod.POST, value = "/topics/key1")
public void addTopic(@RequestBody Topic topic, @PathVariable String key1) 
    topicService.saveOrUpdateTopic(topic, key1);

如果您需要更清晰的信息,请告诉我,我可以创建一个示例应用并与您分享。 谢谢!

【讨论】:

太好了,谢谢你的解释,我尝试了模型映射器的方法,它成功了。

以上是关于如何仅将 JSON 请求正文的几个字段从 DTO 发布到 URL 春季启动的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alamofire 请求方法在 POST 的请求正文中发送 JSON 对象数组

如何仅将部分 JSON 元素插入 SQL 字段

Spring boot 的 Postman Post 请求保存了整个 JSON 正文,而不仅仅是字段值。我该如何解决?

Swift 4 上的几个相互依赖的 JSON 请求

Play框架JSON读取:如何读取String或Int?

Java:以 XML 或 JSON 格式请求正文而不使用字符串