我使用 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 请求体由参数名称和值组成。如果我理解正确的话,你想发送这样的请求:
{
"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 字段名。