当前位置: 首页 > news >正文

restTemplate禁用url编码

这篇文章资料来自于网络,对部分知识整理,这里只是记录一下,仅供参考

一、现象


在restTemplate调用方法的时候默认对url做了编码处理
如果路径里面带了参数,url?param={"name":"张三","age":22}

这时这处理url的时候就要先对json数据进行编码处理

url?param=%7B%22name%22%3A%22%E5%BC%A0%E4%B8%89%22%EF%BC%8C%22age%22%3A22%7D

这时使用restTemplate调用接口,会对url再次编码成

url%3Fparam%3D%257B%2522name%2522%253A%2522%25E5%25BC%25A0%25E4%25B8%2589%2522%25EF%25BC%258C%2522age%2522%253A22%257D

接口放接收到路径解码后

url?param=%7B%22name%22%3A%22%E5%BC%A0%E4%B8%89%22%EF%BC%8C%22age%22%3A22%7D

并不是url?param={"name":"张三","age":22}

我们想要的结果并不想restTemplate调用的时候二次编码,而是使用我们的url

二、处理方式

1、禁用setEncodingMode


在代码中定义多个restTemplate

@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(RestTemplateBuilder builder) {RestTemplate build = builder.build();List<HttpMessageConverter<?>> messageConverters = build.getMessageConverters();messageConverters.add(new CustomJacksonHttpMessageConverter());return build;}@Beanpublic RestTemplate restTemplateNoEncode(RestTemplateBuilder builder) {RestTemplate build = builder.build();DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory();defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);List<HttpMessageConverter<?>> messageConverters = build.getMessageConverters();messageConverters.add(new CustomJacksonHttpMessageConverter());build.setUriTemplateHandler(defaultUriBuilderFactory);return build;}
}


使用的时候使用@Qualifier指定名称就可以
    @Autowired
    @Qualifier("restTemplateNoEncode")
    private RestTemplate restTemplate;

2、使用URL对象,避免了queryUrl被RestTemplate进行2次UrlDecode

       在将queryUrl传入RestTemplate之前,将其封装为一个URL对象,避免了queryUrl被RestTemplate进行2次UrlDecode

String queryUrl =  serverURL+"?query="+ URLEncoder.encode(serverQL, StandardCharsets.UTF_8.toString());
URI uriObj = URI.create(queryUrl);
String http = null;
try {http = RestTemplateUtil.get(uriObj);log.info("【监控指标】查询结果:" + http);
} catch (Exception e) {log.error("【监控指标】获取异常,请求地址:{},请求指标:{},异常信息:{}", serverURL, serverQL, e);
}

 同时RestTemplate传参也是传入一个URL对象:

public static String get(URI url) {HttpHeaders headers = new HttpHeaders();headers.add("Accept", "application/json");headers.add("Content-Encoding", "UTF-8");headers.add("Content-Type", "application/json; charset=UTF-8");HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);ResponseEntity<String> response = RestTemplateUtil.getInstance().exchange(url, HttpMethod.GET, requestEntity, String.class);String responseBody = response.getBody();return responseBody;

三、参考:

restTemplate禁用url编码_resttempalte不encodeurl-CSDN博客

Java开发笔记之%被转码为%25导致url无法请求-腾讯云开发者社区-腾讯云

http://www.dtcms.com/a/320259.html

相关文章:

  • 安装mkdocs
  • Python从入门到精通——第六章 字典与集合
  • 「日拱一码」046 分支定界算法
  • Airflow 入门案例教程
  • 前端性能优化:从请求到资源的精细调控
  • 【第9话:感知算法基础1】深度学习神经网络模型基础知识概念入门简介
  • 批量获取亚马逊商品SKU商品规格调用流程
  • 【实时Linux实战系列】基于实时Linux的高频交易系统构建
  • Python 常用内置高阶函数
  • RabbitMQ面试精讲 Day 15:RabbitMQ故障转移与数据恢复
  • C++ min循环超超超详细指南
  • WFP DNS 域名解析
  • 深入理解C++模板进阶:非类型参数、特化与分离编译
  • Linux节点创建API与路径对应关系
  • AI日报0807 | GPT-5或今晚1点来袭:四大版本全曝光
  • 什么是 TDengine IDMP?
  • Disruptor 消费者核心:BatchEventProcessor解析
  • 告别复杂配置!cpolar让Prometheus监控突破网络限制
  • 【42】【OpenCV C++】 计算图像某一列像素方差 或 某一行像素的方差;
  • 嵌入式开发硬件——单片机
  • 【列出指定时间段内所有的下单产品】
  • 数据结构(循环顺序队列)
  • RAGAS:检索增强生成系统的无参考评估框架与技术解析
  • 2025年华数杯C题超详细解题思路
  • 哈希表原理与实现全解析
  • 天道20金句
  • Moses工具的配置和小语种平行语料训练SMT完整实现
  • 大模型 Transformer模型(上)
  • Java集合的遍历方式(全解析)
  • 力扣经典算法篇-46-阶乘后的零(正向步长遍历,逆向步长遍历)