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日

相关文章

  • 一文精通Java 多线程之全方位解读

    “一文精通Java 多线程之全方位解读”是一篇介绍Java多线程知识的文章,介绍了Java多线程的基础知识、线程的生命周期、多线程并发问题、锁机制、线程池等内容。 下面是详细的攻略: 基础知识 在多线程编程之前我们首先需要了解Java多线程的相关概念,例如进程、线程、线程状态、上下文切换等。文章首先详细讲解了这些基础知识,让读者对Java多线程编程有一个整体…

    Java 2023年5月19日
    00
  • 详解Java中的泛型

    详解Java中的泛型 什么是泛型? 泛型是一种编程方式,它允许在编译时期定义接受不同类型的类、接口和方法。通过泛型,我们可以创建适用于多种类型的代码,这些代码可以避免类型转换,提高代码的可读性和重用性。 泛型的基本语法是在尖括号中声明类型参数,例如 List\<T>,其中 T 就是类型参数,表示可以接受任何类型。在实际使用时,需要将 T 替换为具…

    Java 2023年5月26日
    00
  • 浅谈SpringBoot是如何实现日志的

    下面是关于SpringBoot日志的详细讲解。 1. SpringBoot日志功能简介 SpringBoot内置了多种常见的日志框架,如Log4J、Logback和JavaUtilLogging等。在SpringBoot中可以通过配置相关参数来切换使用不同的日志框架,同时还可以配置日志级别、输出格式等。 2. SpringBoot日志框架选择及配置 2.1 …

    Java 2023年5月15日
    00
  • Java多线程编程之ThreadLocal线程范围内的共享变量

    下面是详细讲解Java多线程编程之ThreadLocal线程范围内的共享变量的攻略。 简介 在多线程编程当中,线程间的数据共享和数据保护是非常重要的。ThreadLocal就是一种解决多线程数据共享和数据保护的技术,它能够实现线程间数据的隔离,使得不同线程之间访问自己保存的变量,就好像在每个线程里面都有一个私有的变量一样。 简单地说,ThreadLocal是…

    Java 2023年5月19日
    00
  • 基于javaMybatis存进时间戳的问题

    那我来详细讲解一下关于“基于Java Mybatis存进时间戳的问题”的攻略。 问题背景 在使用Java Mybatis框架进行MySQL数据库操作时,我们有时需要将时间信息存储为时间戳(长整型),然后进行操作。但在实际操作中,我们有可能遇到时间戳值存储不对的问题,导致数据不正确。 解决方案 方案1:使用注解方式进行时间戳的映射 在Mybatis的实体映射中…

    Java 2023年5月20日
    00
  • java多线程模拟交通灯管理系统

    下面我将详细讲解如何编写一个Java多线程模拟交通灯管理系统。 前言 交通灯是城市中必不可少的重要设施之一,能帮助路面交通管理变得更加有序。为了更好地理解交通灯的工作原理,我们可以开发一个Java多线程模拟交通灯管理系统来模拟交通灯的运行过程。 设计思路 我们的系统需要设计两个交通灯对象,即红绿灯和绿红灯,交替更替地工作。为了实现此目的,我们可以使用多线程的…

    Java 2023年5月19日
    00
  • Spring MVC的参数绑定和返回值问题

    Spring MVC的参数绑定和返回值问题 在Spring MVC框架中,控制器的方法是用来处理请求的,而参数绑定和返回值则是掌握Spring MVC的关键所在。在这篇文章中,我们将详细讨论Spring MVC的参数绑定和返回值问题。 参数绑定 Spring MVC框架中的参数绑定是指将HTTP请求中的参数自动地绑定到控制器方法的参数中。具体而言,就是将HT…

    Java 2023年6月15日
    00
  • Java日常练习题,每天进步一点点(45)

    这里是关于“Java日常练习题,每天进步一点点(45)”的完整攻略: 1. 题目描述 该题目是一道字符串操作的练习题,在给定的字符串中找到第一个不重复的字符并返回其下标,如果不存在不重复的字符,就返回 -1。 2. 解题思路 字符串操作的题目,可以使用哈希表来解决。我们可以先遍历整个字符串,用哈希表来统计每个字符出现的次数,然后再次遍历字符串,找到第一个出现…

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