我正在使用Apache HTTP Components Client 4.5.7来请求包含双斜杠的URL。当我查看接线日志时,我看到双斜杠被“固定”为仅一个斜杠。不幸的是,这对我来说不是可取的举动,因为它将导致请求失败。
背景:我正在从Thumbor(图像调整大小服务器)请求调整图像大小。 Thumbor URL基本上如下所示:
此网址将导致Thumbor下载http://host.com/image.jpg并调整其大小以适合200x200像素。
代码如下:
HttpGet httpUriRequest = new HttpGet("http://thumbors-server/usafe/200x200/http://host.com/image.jpg");
CLIENT.execute(httpUriRequest, responseHandler);
httpclient发送到服务器的内容。但这是
DEBUG o.a.h.headers http-outgoing-1 >> GET /unsafe/300x300/http:/host.com/image1.jpg HTTP/1.1
DEBUG o.a.h.headers http-outgoing-1 >> Host: localhost:4002
DEBUG o.a.h.headers http-outgoing-1 >> Connection: Keep-Alive
DEBUG o.a.h.headers http-outgoing-1 >> User-Agent: Apache-HttpClient/4.5.7 (Java/11.0.1)
DEBUG o.a.h.headers http-outgoing-1 >> Accept-Encoding: gzip,deflate
请注意,http://host.com已替换为http:/host.com(请注意缺少的第二个/)。这将导致请求失败。
如何阻止http客户端“修复”我传递给它的URL?
答案 0 :(得分:0)
问题在URIUtils.rewriteURI()
中,该代码在哪里:
final StringBuilder buf = new StringBuilder(path.length());
boolean foundSlash = false;
for (int i = 0; i < path.length(); i++) {
final char ch = path.charAt(i);
if (ch != '/' || !foundSlash) {
buf.append(ch);
}
foundSlash = ch == '/';
}
uribuilder.setPath(buf.toString());
因此,uri路径中的双斜杠总是替换为一个斜杠。您可以使用其他http客户端,例如 OkHttp ,但不会进行这种标准化。
答案 1 :(得分:0)
对于我遇到的类似情况,最好的解决方案是使用URLEncoder.encode对嵌入的URL进行url编码。
在您的示例中,
new HttpGet("http://thumbors-server/usafe/200x200/" + URLEncoder.encode("http://host.com/image.jpg", "UTF-8"))