项目对接第三方接口,接口参数编码规则为GBK,请求方式为application/x-www-form-urlencoded

String url = "http://127.0.0.1:8999/test?a=1&message=" + URLEncoder.encode("消息");
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);

发现使用RestTemplate执行方法时,第三方接口无法正确解码参数。
查看源码发现会再创建URI,而URI 的默认字符编码为UTF-8,所以请求时会对url进行二次编码

	@Override
	@Nullable
	public <T> T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback,
			@Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables) throws RestClientException {
		URI expanded = getUriTemplateHandler().expand(url, uriVariables);
		return doExecute(expanded, method, requestCallback, responseExtractor);
	}

解决方法url字符串传参改为URI

		MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.add("a", "1");
        map.add("message", "消息");
        UriComponentsBuilder builder = UriComponentsBuilder.fromUriString("http://127.0.0.1:8999/test");
        builder.queryParams(map);
        builder.encode(Charset.forName("gbk"));
        URI uri = builder.build().toUri();
        ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, httpEntity, String.class);
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐