如何仅将 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 对象数组