Java中发送含非法字符<的GET请求的实现方案咨询
解决方案:Java HTTP客户端保留原始
<字符发送请求 由于目标API服务器不符合HTTP标准(未解码合法的URL编码字符),需要绕过客户端的自动编码逻辑,直接发送包含<的原始请求路径。以下是主流Java HTTP客户端的具体配置方法:
OkHttp
直接使用完整URL字符串构建请求,避免使用HttpUrl.Builder(该工具会自动编码特殊字符):
OkHttpClient client = new OkHttpClient(); String rawUrl = "http://api.example.com/key/foo<bar"; Request request = new Request.Builder() .url(rawUrl) .get() .build(); try (Response response = client.newCall(request).execute()) { // 处理响应逻辑 }
Apache HttpClient
直接传入包含<的完整URL字符串创建HttpGet请求,跳过客户端的编码逻辑:
CloseableHttpClient client = HttpClientBuilder.create().build(); HttpGet request = new HttpGet("http://api.example.com/key/foo<bar"); try (CloseableHttpResponse response = client.execute(request)) { // 处理响应逻辑 }
如果需要动态拼接路径,手动拼接后直接传入字符串即可,不要使用URIBuilder构建路径参数。
Feign
通过自定义RequestInterceptor强制替换编码后的%3C为原始<,需确保拦截器执行后客户端不会再次编码:
public class RawUriInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { String rawUri = template.url().replace("%3C", "<"); template.uri(rawUri); } } // 配置Feign客户端时添加拦截器 YourApiClient client = Feign.builder() .requestInterceptor(new RawUriInterceptor()) .target(YourApiClient.class, "http://api.example.com");
如果是固定路径,也可以直接在@RequestLine注解中写原始路径,跳过模板编码:
public interface YourApiClient { @RequestLine("GET /key/foo<bar") Response getTargetResource(); }
Spring WebClient
方式1:直接传入完整原始URL
WebClient client = WebClient.create(); client.get() .uri("http://api.example.com/key/foo<bar") .retrieve() .bodyToMono(String.class) .block();
方式2:动态路径时关闭自动编码
String dynamicPath = "foo<bar"; UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://api.example.com/key/{path}") .encode(false); // 禁用自动编码 URI rawUri = builder.buildAndExpand(dynamicPath).toUri(); WebClient client = WebClient.create(); client.get() .uri(rawUri) .retrieve() .bodyToMono(String.class) .block();
内容的提问来源于stack exchange,提问作者avl
相关产品推荐
相关产品推荐

