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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:31:00