如何使用 Spring Cloud OpenFeign 发送正文中包含单个字符串值的 JSON 请求

问题描述 投票:0回答:1

我使用 Spring Cloud OpenFeign 版本 4.0.1 声明 FeignClient。我调用的 API 期望请求主体中的原始 JSON 字符串值(例如

"something"
)作为引号中的字符串。但我正在努力使用 Feign 来实现它。

代码示例:

@FeignClient(value = "client", url = "https://${example.host}:${example.port}/api/2/", dismiss404 = true)
public interface ExampleClient {
    @GetMapping(value = "/path/to/resource", produces = MediaType.APPLICATION_JSON_VALUE)
    String getResourceValue();

    @PutMapping(value = "/path/to/resource", consumes = MediaType.APPLICATION_JSON_VALUE)
    void setResourceValue(@RequestBody String hostname);
}

代码只是将字符串序列化为纯文本主体,而不添加引号(甚至删除它们)。在反序列化中,它返回包含引号的字符串,并且不会删除它们。我知道这是预期的行为,但我怎样才能实现客户端将简单的 String 值序列化和反序列化为有效的 JSON?

我能找到的唯一解决方法是用 Jackson

TextNode
类替换 String 类型。但这不是非常优雅的解决方案。也可以通过设置
JacksonEncoder
而不是 Spring 实现来实现,但随后我失去了其他功能。

json spring-boot spring-cloud-feign openfeign
1个回答
0
投票

Json 请求体由参数名称和值组成。如果我理解正确的话,你想发送这样的请求:

{
    "hostname":"someValue"
}

在您的代码中,feign 不知道参数的名称是什么。您需要创建一个类,其中包含一个字段 - 主机名。像这样:

public class Input {

private String hostname;

// add getters and setters

}

然后将其作为参数传递给 feign 方法:

@PutMapping(value = "/path/to/resource", consumes = MediaType.APPLICATION_JSON_VALUE)
void setResourceValue(@RequestBody Input input);

Feign 会自动将字段名映射到 json 字段名。

© www.soinside.com 2019 - 2024. All rights reserved.