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日

相关文章

  • JS求多个数组的重复数据

    如果想要求多个数组中的重复数据,可以使用以下方法: 定义一个函数,接收多个数组作为参数; 对于每个数组,遍历其中的每一个元素,判断该元素在其他数组中是否也存在; 如果其他数组中也存在该元素,则说明该元素是多个数组中的重复数据,将其添加到结果数组中; 返回结果数组。 代码如下: function findDuplicates(…arrays) { cons…

    Java 2023年5月26日
    00
  • 不到30行JS代码实现Excel表格的方法

    如何用少于30行的JS代码实现Excel表格呢?接下来让我们详细讲解一下。 概述 首先,我们需要明确两件事情:一是我们要创建一个表格,二是我们要将表格数据导出为Excel文件。实现这两个功能,需要用到一些JS库和API。 准备工作 在编写JS代码之前,我们需要先安装以下两个JS库: SheetJS:该库可以使我们将表格数据转换为Excel文件。 FileSa…

    Java 2023年6月15日
    00
  • Java面向对象程序设计:继承,多态用法实例分析

    Java面向对象程序设计:继承,多态用法实例分析 简介 面向对象程序设计是Java中最重要的编程思想。其中继承和多态是面向对象程序设计中的两大特性。继承和多态的运用可以对代码架构做到高度的灵活和可维护性,是我们编写高质量代码的关键。 继承 继承是Java中面向对象程序设计的核心概念之一。继承可以使我们的代码重用和复用,提高编程效率。在Java中一个类可以继承…

    Java 2023年5月26日
    00
  • spring如何实现依赖注入DI(spring-test方式)

    Spring实现依赖注入DI(spring-test方式) Spring是一个基于Java的开源框架,已经成为现代Java开发的事实标准,是构建企业级应用程序的首选框架之一。Spring实现了依赖注入(DI),使得开发者可以更加方便地编写可测试可维护的代码。本篇文章将详细介绍Spring如何实现依赖注入DI,以及如何使用spring-test进行测试。 DI…

    Java 2023年5月19日
    00
  • MyBatis-Plus 通用IService使用详解

    以下是关于“MyBatis-Plus 通用IService使用详解”的详细攻略: 什么是MyBatis-Plus通用IService? 在使用MyBatis-Plus进行数据库操作时,通用IService提供了一套标准CURD方法,极大减轻我们手写CRUD的压力。通用IService是MyBatis-Plus提供的一个接口,包含一系列的基础CURD方法,可以…

    Java 2023年5月20日
    00
  • java实现文件读写与压缩实例

    Java实现文件读写与压缩实例 文件读取 Java中可以通过File类和FileInputStream类来实现文件读取。其中,File类用于表示文件对象,而FileInputStream类用于读文件的数据流。 下面是一个简单的文件读取的示例代码,读取指定路径下的txt文件: import java.io.File; import java.io.FileIn…

    Java 2023年5月20日
    00
  • SpringBoot创建maven多模块项目实战代码

    下面是创建Spring Boot Maven多模块项目的完整攻略。 1. 创建Maven父级项目 首先,我们需要创建一个Maven父级项目,它将作为我们多模块项目的容器。使用以下命令创建一个空项目: $ mvn archetype:generate -DgroupId=com.example -DartifactId=parent -DarchetypeAr…

    Java 2023年5月19日
    00
  • Java 进阶必备之ssm框架全面整合

    Java 进阶必备之ssm框架全面整合攻略 本攻略介绍如何使用SSM框架进行Java Web应用程序的开发,SSM是指Spring+SpringMVC+MyBatis这三个框架的整合。下面将分步骤详细讲解如何实现。 第一步:环境搭建 1.1 JDK安装 首先你需要在本地安装Java的运行环境,建议选择JDK 1.8以上版本。 1.2 Tomcat安装 我们可…

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