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

yizhihongxing

当我们使用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日

相关文章

  • 关于fastjson的@JSONField注解的一些问题(详解)

    关于 fastjson 的 @JSONField 注解的一些问题(详解) fastjson 是一款非常优秀的 Java 序列化/反序列化框架,在序列化对象时使用 @JSONField 注解可以定义一些序列化和反序列化时的行为,本篇文章将详细讲解 @JSONField 注解的使用方法和一些注意事项。 基本用法 @JSONField 注解可以标注在类的属性上面,…

    Java 2023年5月26日
    00
  • ASP.NET+Web服务实现软件共享

    ASP.NET是一种基于微软的.NET框架的Web开发技术,可以用来开发Web应用程序和Web服务。Web服务是一种通过网络调用的应用程序,可以与不同的平台和语言进行交互。因此,使用ASP.NET和Web服务可以实现软件的共享,方便多个平台和语言之间的数据传输和交互。 以下是实现软件共享的ASP.NET+Web服务攻略: 创建Web服务 首先需要创建一个AS…

    Java 2023年6月15日
    00
  • 利用AOP实现系统告警的方法详解

    下面我会详细讲解“利用AOP实现系统告警的方法详解”的完整攻略: 一、AOP概述 AOP(Aspect Oriented Programming)又称面向切面编程,是一种编程思想和技术。它的主要作用是将一些系统范围内的横切关注点(如:日志记录、安全控制、事务处理等),按照一定的规则,通过编程的方式,插入到系统的各个阶段中,从而实现系统关注点的分离。 二、实现…

    Java 2023年5月27日
    00
  • 十三、JSP动作

    JSP动作(Action)是JSP页面中特殊的标识,可以在JSP中调用Servlet或JavaBean,也可以完成JSP页面的控制流程、变量的传递、构建自定义标签库等功能。JSP动作在JSP中是由尖括号包裹的标识,其中尖括号后面是关键词,关键词和它们的值都是用特殊的语法结构来定义的。本文将实现JSP动作的完整攻略。 1、JSP动作的类型 JSP动作主要分为三…

    Java 2023年6月15日
    00
  • 使用springboot单元测试对weblistener的加载测试

    使用Spring Boot进行单元测试的过程是重要的开发实践之一,特别是在测试Web应用程序时。下面是使用Spring Boot进行WebListener加载测试的完整攻略,主要分为以下几个步骤: 第一步:创建Spring Boot应用程序 首先,我们需要创建一个Spring Boot应用程序作为示例。这里我们使用Spring Initializr工具创建一…

    Java 2023年5月26日
    00
  • Java日常练习题,每天进步一点点(7)

    Java日常练习题系列是一组适合Java初学者的练习题,能够帮助Java新手提高编程水平和理解各种基础算法。对于第七篇“Java日常练习题,每天进步一点点(7)”,我会详细讲解攻略。 题目简介 本篇练习题共有5道题目,包含以下内容:1. 实现冒泡排序2. 编写水仙花数判断程序3. 编写斐波那契数列的程序4. 编写二分查找算法5. 编写插入排序 题目解析 1.…

    Java 2023年5月20日
    00
  • JAVA实现Base64编码的三种方式

    JAVA实现Base64编码的三种方式 Base64是一种用64个字符来表示二进制数据的方法,通常用于在HTTP等情境下传递二进制数据。在JAVA中,我们可以通过以下三种方式来进行Base64编码的实现。 1. 使用Java 8提供的java.util.Base64类(推荐使用) Java 8 中增加了一个 Base64 类,用于提供一种标准的Base64编…

    Java 2023年5月19日
    00
  • JAVA JNI原理详细介绍及简单实例代码

    先来介绍一下什么是JNI。 JNI,全称为Java Native Interface,即Java本地接口,是一个开发工具包,提供了一种使Java代码和本地代码(C、C++等)交互的机制。 开发者可以使用JNI将本地的代码嵌入到Java应用程序中,从而充分发挥本地代码的性能,是Java与本地代码的桥梁。 下面我来分步骤详细讲解“JAVA JNI原理详细介绍及简…

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