You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring RestTemplate处理含单引号的GET URL失效,Postman可正常请求

解决RestTemplate GET请求中URL单引号导致的请求失败问题

我之前也踩过这个坑!你遇到的问题核心是URL参数里的单引号在Java的字符串处理或URL构建工具中被错误解析,而Postman会自动帮你处理好特殊字符的编码,所以能正常请求。下面给你两种靠谱的解决方案:


方案一:用Spring的UriComponentsBuilder构建URL(推荐)

Spring提供的UriComponentsBuilder是处理URL构建的最佳实践,它会自动帮你处理参数中的特殊字符(包括单引号),避免手动拼接的麻烦。代码示例:

// 1. 构建URI
URI uri = UriComponentsBuilder.fromUriString("/api/odata/GetAvailableObjects")
        .queryParam("fromTime", "datetime'2018-02-02T12:00:00'")
        .queryParam("$format", "json")
        .queryParam("toTime", "datetime'2018-02-10T12:00:00'")
        .build()
        .encode() // 确保特殊字符被正确URL编码
        .toUri();

// 2. 配置请求头
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.ALL));
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
headers.add("Authorization", "你的授权token");

// 3. 发起请求
HttpEntity<String> entity = new HttpEntity<>(headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);

为什么这个方法有效?UriComponentsBuilder会自动识别参数中的特殊字符,将单引号编码为%27(符合URL规范),RestTemplate发送请求时会正确传递这个参数,和Postman的处理逻辑一致。


方案二:修复MessageFormat的单引号转义问题

如果你坚持要用MessageFormat,要注意它把单引号当作格式占位符的转义字符,所以需要用两个单引号来表示一个实际的单引号。代码示例:

// 注意:格式串里的单引号要写两个
String urlPattern = "/api/odata/GetAvailableObjects?fromTime=datetime''{0}''&$format=json&toTime=datetime''{1}''";
String fromTime = "2018-02-02T12:00:00";
String toTime = "2018-02-10T12:00:00";
String url = MessageFormat.format(urlPattern, fromTime, toTime);

// 后续请求头和exchange调用和上面一致

这样生成的URL里,datetime''{0}''会被解析为datetime'2018-02-02T12:00:00',符合接口要求。


为什么Postman能正常工作?

Postman在发送请求前,会自动对URL中的特殊字符进行URL编码(比如把单引号转成%27),而Java的MessageFormat或手动拼接字符串时,不会自动做这件事,导致参数传递错误。用UriComponentsBuilder就能完美解决这个差异问题。

内容的提问来源于stack exchange,提问作者dejantm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:46:47