Apache Http Client-停止从URL删除双斜杠

时间:2019-02-08 11:08:23

标签: java apache-httpcomponents

我正在使用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?

2 个答案:

答案 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"))