RestTemplate.exchange()不编码'+'?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RestTemplate.exchange()不编码'+'?相关的知识,希望对你有一定的参考价值。

RestTemplate.exchange()将编码URL中的所有无效字符,但不编码+,因为+是有效的URL字符。但是如何在任何URL的查询参数中传递+

答案

如果传递给RestTemplate的URI已将编码设置为true,则它将不会对您传递的URI执行编码。

import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.util.Collections;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

class Scratch {

  public static void main(String[] args) {

    RestTemplate rest = new RestTemplate(
        new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json");
    headers.add("Accept", "application/json");
    HttpEntity<String> requestEntity = new HttpEntity<>(headers);

    UriComponentsBuilder builder = null;
    try {
      builder = UriComponentsBuilder.fromUriString("http://example.com/endpoint")
          .queryParam("param1", URLEncoder.encode("abc+123=", "UTF-8"));
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

    URI uri = builder.build(true).toUri();
    ResponseEntity responseEntity = rest.exchange(uri, HttpMethod.GET, requestEntity, String.class);
  }

}

因此,如果您需要在其中传递+的查询参数,那么RestTemplate将不会对+进行编码,但是每个其他无效的URL字符+都是有效的URL字符。因此,你必须首先编码param(URLEncoder.encode("abc+123=", "UTF-8"))然后将编码的param传递给RestTemplate,说明URI已经使用builder.build(true).toUri();编码,其中true告诉RestTemplate URI是alrady编码的,所以不再编码,因此+将被传递为%2B

  1. 使用qazxsw poi OUTPUT:qazxsw poi作为编码将执行一次。
  2. 使用qazxsw poi OUTPUT:qazxsw poi作为编码将执行两次。

以上是关于RestTemplate.exchange()不编码'+'?的主要内容,如果未能解决你的问题,请参考以下文章

RestTemplate.exchange()不编码'+'?

自定义HttpMessageConverter实现RestTemplate的exchange方法返回自定义格式数据

如何在 Mockito 测试中修复 RestTemplate.exchange 的空值响应?

RestTemplate 记录 POST 数据

Spring Resttemplate 异常处理

模拟 resttemplate 交换总是返回 null