feign调用中文参数被encode编译的问题

当我们使用Feign进行调用时,如果参数中含有中文或其他非ASCII字符,我们会发现这些参数被自动编码了,而且编码方式并不是我们常见的UTF-8,这就需要我们进行一些额外的配置来解决这个问题。

一般情况下,我们需要在Feign配置中添加一个编码器类,用于将参数编码成UTF-8格式,例如:

@Configuration
public class FeignConfig {

    @Bean
    public Encoder feignEncoder() {
        return new SpringEncoder(new HttpMessageConverters(new Utf8StringHttpMessageConverter()));
    }

}

这里我们使用了Spring内置的编码器类SpringEncoderHttpMessageConverters,同时还需要自定义一个编码器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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Mybatis的Dao层实现原理分析

    接下来我将详细讲解Mybatis的Dao层实现原理分析的完整攻略。 什么是Dao层 Dao层是指数据访问层,它负责与数据库进行交互,完成数据的增、删、改、查等操作。在Dao层中,最常用的是SQL语句。Mybatis是一种主流的持久层框架,它的Dao层实现原理值得深入学习。 Mybatis的Dao层实现原理 1. 配置文件 Mybatis框架使用XML文件来配…

    Java 2023年5月20日
    00
  • java编程实现多人聊天室功能

    介绍 为了实现多人聊天室功能,我们需要使用Java编程语言和基于Socket的网络编程来实现。此外,我们需要使用客户端/服务器架构来将所有聊天相关的逻辑和处理放在服务器端。在本文中,我将详细介绍如何使用Java编程实现多人聊天室功能。 步骤1:创建服务器 我们首先需要创建一个服务器来管理所有客户端之间的聊天。为此,我们需要创建一个Java类来实现服务器逻辑。…

    Java 2023年5月19日
    00
  • 脚本发生错误怎么解决 当前页的脚本发生错误的解决方法小结

    脚本发生错误怎么解决 当网站出现脚本发生错误时,可能导致页面无法正常运行,给用户造成极大的困扰,因此我们需要及时修复这些问题,以确保用户的良好体验。本文将为大家介绍如何解决脚本发生错误的问题。 1. 查看错误提示 当脚本发生错误时,浏览器会给出相关的错误提示信息,我们可以根据提示信息快速定位问题所在。常见的错误提示信息包括:语法错误、未定义变量、函数调用错误…

    Java 2023年5月23日
    00
  • java编程实现并查集的路径压缩代码详解

    Java编程实现并查集的路径压缩代码详解 什么是并查集? 并查集(Union-Find)是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。 为什么需要路径压缩? 在并查集的运行过程中,当进行多次find操作时,可能出现树深度太深的问题,导致find操作的时间复杂度增加。在这种情况下,就需要使…

    Java 2023年5月26日
    00
  • 详解Java中的反射机制和动态代理

    详解Java中的反射机制和动态代理 什么是反射机制 反射机制是Java语言中的一种机制,它可以在程序运行时获取一个类的信息,包括类的名称、父类、接口、属性、方法等,还可以在运行时获取和设置对象的属性和方法,创建对象并调用方法。 Java中的反射机制主要包括以下几个类: Class:代表一个类,可以获取一个类的信息,如名称、直接父类、实现的接口、构造方法、属性…

    Java 2023年5月20日
    00
  • 如何解决java获取时间相差8小时的问题

    当使用Java中的Date类或者Calendar类获取当前时间时,由于Java默认使用的是UTC(Coordinated Universal Time,协调世界时)时间,可能会导致本地获取的时间与实际时间相差8小时。解决这一问题的方法有以下两种: 1.使用DateFormat进行格式化输出 可以使用SimpleDateFormat类将获取到的Date对象按照…

    Java 2023年5月20日
    00
  • JAVA基于SnakeYAML实现解析与序列化YAML

    下面就是“JAVA基于SnakeYAML实现解析与序列化YAML”的完整攻略。 什么是YAML? YAML是一种轻量级的数据交换格式,它特别适合于人类编辑或查看。与JSON、XML等数据格式相比,它更为简洁、易于理解和编写,而且可以支持嵌套的数据结构。 SnakeYAML是什么? SnakeYAML是一个Java库,提供对YAML的解析和生成。通过Snake…

    Java 2023年5月26日
    00
  • Spring Security表单配置过程分步讲解

    下面是关于Spring Security表单配置过程分步讲解的攻略,包含以下几个步骤: 引入Spring Security依赖 要使用Spring Security,需要在项目中引入相应的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframewor…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部