Java 如何阻止伪造和转义字符串数据

Java 如何阻止伪造和转义字符串数据,java,json,netflix-feign,feign,Java,Json,Netflix Feign,Feign,我有一个代理,它位于使用json对象进行通信的客户机和服务器之间。代理需要将数据作为字符串处理。它不知道扫描数据以查找字符串所需的类型。问题是,当我从代理服务器将数据转发到服务器时,字符串被引用,字符串中的引号被转义。我需要按原样发送字符串 @Headers({"Accept: application/json"}) interface ExampleClient { @Headers({"Content-Type: application/json"}) @RequestLine

我有一个代理,它位于使用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}"
无论内容类型设置为什么,都会发生这种情况

我是否可以在不使用QOUT的情况下使用FIGN发布字符串

在我的代码中

GsonDecoder decoder = new GsonDecoder();
                client = Feign.builder()                
                **.encoder(new GsonEncoder())**
                .logLevel(feign.Logger.Level.FULL)
                .logger(new Slf4jLogger(CampaignsClient.class))
                .requestInterceptor(template -> template.header(AUTHORIZATION_HEADER, "Bearer ..."))
                .target(CampaignsClient.class, "https://server");

我删除了代码行.encoder(新的GsonEncoder())并假装停止字符串转义。

您如何看待这个转义的引号?在你的IDE中?或者当您执行
System.out.println(serializedBody)时?对我来说,这看起来像是IDE对非转义字符串的表示。如果这是通过
System.out.println
的序列化体的实际输出,那么您可能可以通过传入非序列化对象而不是已经序列化的字符串来修复此问题。我的猜测是,
JacksonEncoder
正在将您的字符串编码为JSON,因为它没有意识到它已经编码,并且您在标题中指定了
“Content-Type:application/JSON”
。或者可以尝试使用自己的pass-through
Encoder
,如果它已经是
字符串,则只返回值。我有一个工具,位于客户端和服务器之间,用于显示原始http流、头和所有内容。服务器需要json对象,但代理对字符串进行操作。因此,我们的想法是从代理的角度将请求作为字符串转发,但让服务器将其解释为json。我认为,由于内容类型的原因,feign决定引用字符串。我只是使用了apache的http客户端,然后听起来好像不是你想要的。您可能需要一个简单的代理。可能是这样的:您还可以编写一个直通编码器,用于强制转换body对象并像:
return(String)object那样返回它
(假设所有端点都使用字符串passthrough)和
Feign.builder().encoder(新的MyPassThroughEncoder()).target(MyApi.class,myRootUri)
。但我真的认为对于你想做的事情来说,假装是错误的工具。