当我们使用Feign进行调用时,如果参数中含有中文或其他非ASCII字符,我们会发现这些参数被自动编码了,而且编码方式并不是我们常见的UTF-8,这就需要我们进行一些额外的配置来解决这个问题。
一般情况下,我们需要在Feign配置中添加一个编码器类,用于将参数编码成UTF-8格式,例如:
@Configuration
public class FeignConfig {
@Bean
public Encoder feignEncoder() {
return new SpringEncoder(new HttpMessageConverters(new Utf8StringHttpMessageConverter()));
}
}
这里我们使用了Spring内置的编码器类SpringEncoder
和HttpMessageConverters
,同时还需要自定义一个编码器Utf8StringHttpMessageConverter
,该类继承自StringHttpMessageConverter
,并重写了其父类的getSupportedMediaTypes()方法,返回一个包含MediaType.TEXT_PLAIN_VALUE和MediaType.ALL_VALUE两种媒体类型的List。
public class Utf8StringHttpMessageConverter extends StringHttpMessageConverter {
@Override
public List<MediaType> getSupportedMediaTypes() {
List<MediaType> types = new ArrayList<>();
types.add(MediaType.TEXT_PLAIN);
types.add(MediaType.ALL);
return types;
}
@Override
protected MediaType getDefaultContentType(String s) throws IOException {
return MediaType.TEXT_PLAIN;
}
@Override
protected String getDefaultCharset() {
return "UTF-8";
}
}
这样就可以解决Feign调用中文参数被encode编译的问题了。
示例1:调用服务端API,需要传递含有中文的参数
@FeignClient(name = "test", url = "http://localhost:8080", configuration = FeignConfig.class)
public interface TestClient {
@GetMapping("/info")
String getInfo(@RequestParam("name") String name);
}
例如我们要调用服务端的/info
接口,参数中含有中文字符,我们可以这样调用:
String info = testClient.getInfo("你好");
示例2:调用服务端API,需要传递含有特殊字符的参数
@FeignClient(name = "test", url = "http://localhost:8080", configuration = FeignConfig.class)
public interface TestClient {
@GetMapping("/search")
List<User> searchUsers(@RequestParam("name") String name, @RequestParam("label") String label);
}
如果参数中不仅含有中文字符,还包含特殊字符,例如%
、=
等,我们可以使用URLEncoder
对参数进行编码,这样即使参数中含有特殊字符,Feign也能正确识别。
String name = "hello";
String label = URLEncoder.encode("name=测试%26value=123", "UTF-8");
List<User> result = testClient.searchUsers(name, label);
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:feign调用中文参数被encode编译的问题 - Python技术站