禁用http请求上管道字符的编码

时间:2017-06-03 16:40:59

标签: java http jsoup

我正在尝试向使用其URL中的管道字符的URL发送请求 site.com/page?param=|||

使用Jsoup和URLConnection向此URL发送请求会导致管道字符编码为%7C,但是,该站点仅接受未编码的|

我已经用fiddler检查了,并注意到Web浏览器不对管道字符进行编码,那么为什么java库(我猜的URI类)必须对其进行编码? 并且有没有办法在发送请求时强制(或禁用该特定字符的编码)?

1 个答案:

答案 0 :(得分:0)

我有一个测试,并使用JsoupURLConnection发送请求,我注意到URLConnection没有对网址进行编码。这是我的测试代码:

Connection jsoupConnection = Jsoup.connect("http://www.baidu.com/page?param=|||");
Document document = jsoupConnection.get();
URL url=new URL("http://www.baidu.com/page?param=|||");
URLConnection urlConnection = url.openConnection();
InputStream input = urlConnection.getInputStream();
byte[] entity = ByteStreams.toByteArray(input);

我使用WireShark监控互联网。这是使用Jsoup时的http数据包:

10  0.011680000 192.168.78.128  115.239.210.27  HTTP    357 GET /page?param=%7C%7C%7C HTTP/1.1

这是URLConnection

27  0.128714000 192.168.78.128  115.239.210.27  HTTP    220 GET /page?param=||| HTTP/1.1

因此,使用URLConnection时未对Url进行编码。

我在connect中查看方法Jsoup的实现,并找到了关键代码:

private static URL encodeUrl(URL u) {
    try {
        //  odd way to encode urls, but it works!
        final URI uri = new URI(u.getProtocol(), u.getUserInfo(), u.getHost(), u.getPort(), u.getPath(), u.getQuery(), u.getRef());
        return new URL(uri.toASCIIString());
    } catch (Exception e) {
        return u;
    }
}

网址编码发生在final URI uri = new URI(u.getProtocol(), u.getUserInfo(), u.getHost(), u.getPort(), u.getPath(), u.getQuery(), u.getRef());,并且Jsoup没有控制编码的属性。

所以我认为你可以使用URLConnection而不是Jsoup