【发布时间】:2018-04-09 22:58:26
【问题描述】:
我有一个代理,它位于使用 json 对象进行通信的客户端和服务器之间。代理需要将数据作为字符串处理。它不知道它只需要扫描数据以查找字符串的类型。问题是当我将数据从代理转发到服务器时,字符串被引用并且字符串中的引号被转义。我需要按原样发送字符串。
@Headers({"Accept: application/json"})
interface ExampleClient {
@Headers({"Content-Type: application/json"})
@RequestLine("POST /examples/postTest")
Response postTest(String body);
}
字符串是
{"name":"Alfred","nickname":"Alfy","number":45}
但在帖子的正文中是
"{\"name\":\"Alfred\",\"nickname\":\"Alfy\",\"number\":45}"
无论内容类型设置为什么,都会发生这种情况。
无论如何我可以使用 feign 发布一个字符串而不会被 qouted 吗?
【问题讨论】:
-
你怎么看这个转义的引用?在你的 IDE 中?或者当你做
System.out.println(serializedBody);?在我看来,这就像 IDE 对非转义字符串的表示。 -
如果这是通过
System.out.println的序列化主体的实际输出,那么您可以通过传入非序列化对象而不是已经序列化的字符串来解决此问题。我的猜测是JacksonEncoder正在获取您的字符串并将其编码为 JSON,因为它没有意识到它已经编码并且您在标题中指定了"Content-Type: application/json"。或者,可以尝试使用您自己的传递Encoder,如果它已经是String,则它只返回值。 -
我有一个位于客户端和服务器之间的工具,它显示原始 http 流、标头和所有内容。服务器需要 json 对象,但代理对字符串进行操作。所以想法是从代理的角度将请求作为字符串转发,但让服务器将其解释为 json。我认为 feign 决定引用字符串是因为内容类型。我最后只使用了 apache 的 http 客户端。
-
那么听起来 Feign 不是你想要的。您可能想要一个简单的代理。也许是这样的:github.com/mitre/HTTP-Proxy-Servlet
-
您也可以编写一个传递编码器,该编码器转换正文对象并返回它,如:
return (String)object;(假设您的所有端点都使用字符串传递)和Feign.builder().encoder(new MyPassThroughEncoder()).target(MyApi.class, myRootUri)。但我真的认为 Feign 不是你想做的事情的错误工具。
标签: java json netflix-feign feign