Vertx WebClient发送大小写敏感URI请求被服务器拒绝如何解决
根因说明
Vert.x 的 vertx-web-client 模块默认开启了URI自动标准化逻辑,部分版本的标准化流程会自动将路径中的字母转为小写,导致你传入的大写格式URI被篡改,触发服务端的大小写敏感校验逻辑被拒绝。
解决方案
方案1:调整WebClient初始化配置,禁用URI标准化
创建WebClient实例时,自定义HttpClientOptions关闭URI自动规范化开关即可保留原始URI的大小写:
import io.vertx.core.http.HttpClientOptions; import io.vertx.ext.web.client.WebClient; // 初始化自定义配置 HttpClientOptions clientOptions = new HttpClientOptions() .setNormalizeUri(false) // 核心配置:禁用URI自动规范化,不会自动转小写、不会自动处理路径符号 .setSsl(true); // HTTPS请求需开启SSL,其他超时、连接池等参数按需配置 // 用自定义配置创建WebClient实例 WebClient client = WebClient.create(vertx, clientOptions);
配置修改后你原有请求方法的代码不需要调整即可正常使用。
方案2:使用绝对路径请求方法绕开规范化逻辑
如果配置调整后仍不生效,可以直接使用postAbs方法传入完整的请求URL,该方法默认不会对传入的URL做标准化处理,会直接保留原始大小写:
public CompletionStage<HttpResponse> post(String host, int port, String uri, MultiMap headers, JsonObject body) { // 自行拼接完整的HTTPS请求地址 String fullRequestUrl = String.format("https://%s:%d%s", host, port, uri); return client.postAbs(fullRequestUrl) .putHeaders(headers) .timeout(requestTimeout.toMillis()) .sendJsonObject(body) .toCompletionStage() .thenApply(response -> new HttpResponse(response.statusCode(), response.body() != null ? response.body().getBytes() : new byte[]{})); }
注意事项
- 禁用URI标准化后,你需要自行保证传入的URI格式合法性,WebClient不再自动修正多余斜杠、相对路径符
../等问题。 - 如果服务端同时对Host头的大小写敏感,你可以手动在headers中添加
Host头指定正确大小写的域名,避免Vert.x自动生成时转小写。
内容的提问来源于stack exchange,提问作者Ali Hosseinzadeh
相关产品推荐
相关产品推荐

