如何阻止Feign对字符串数据进行引用与转义?
解决Feign转发字符串时自动加引号转义的问题
嘿,我正好碰到过类似的Feign转发问题!你说的这种字符串被自动加引号、内部转义的情况,本质是Feign默认把请求体当成JSON对象来序列化了,咱们可以从这几个方向解决:
1. 配置Feign直接发送原始字符串,跳过自动序列化
Feign默认会用Jackson这类转换器把请求体转成JSON结构,如果你要原样发送字符串,得让它别多做这个步骤。
先调整你的Feign接口,把请求参数设为String类型:
@Headers({"Accept: application/json", "Content-Type: application/json"}) interface ExampleClient { @PostMapping("/your-target-endpoint") ResponseEntity<String> forwardRawData(@RequestBody String rawString); }
然后写个自定义配置类,替换掉默认的JSON编码器,改用纯字符串的转换器:
@Configuration public class FeignRawStringConfig { @Bean public Encoder encoder() { return new SpringEncoder(() -> new HttpMessageConverters( new StringHttpMessageConverter(StandardCharsets.UTF_8) )); } }
记得把这个配置关联到你的Feign客户端上,比如在@FeignClient注解里加configuration = FeignRawStringConfig.class,这样Feign就会直接把你的字符串原封不动发出去,不会做JSON序列化的额外处理。
2. 调整Content-Type,让Feign识别为纯文本
如果服务器能接受text/plain类型的请求体,那更简单——直接把Content-Type改成text/plain,Feign就不会把字符串当成JSON来处理了:
@Headers({"Accept: application/json", "Content-Type: text/plain"}) interface ExampleClient { @PostMapping("/your-target-endpoint") ResponseEntity<String> forwardRawData(@RequestBody String rawString); }
这种方式不需要额外配置转换器,适合服务器兼容纯文本请求的场景。
3. 手动构造请求体,完全掌控发送内容
要是上面两种方法都不适用,还可以用Feign的RequestTemplate手动拼请求,彻底绕过自动序列化逻辑:
interface ExampleClient { @RequestLine("POST /your-target-endpoint") @Headers({"Accept: application/json", "Content-Type: application/json"}) ResponseEntity<String> forwardRawData(RequestTemplate template); }
调用的时候直接把你的字符串塞进请求体:
String yourRawData = "你要转发的原始字符串内容"; RequestTemplate template = new RequestTemplate(); template.body(yourRawData, StandardCharsets.UTF_8); exampleClient.forwardRawData(template);
这种方式完全由你控制请求体的内容,绝对不会出现自动转义的问题。
最后提醒下:你的代理既然只需要扫描字符串,别让Feign把请求体解析成JSON对象是关键,保持它的原始字符串形态就能解决问题啦~
内容的提问来源于stack exchange,提问作者Jeff Gaer
相关产品推荐
相关产品推荐

