我正在尝试向使用其URL中的管道字符的URL发送请求
site.com/page?param=|||
使用Jsoup和URLConnection向此URL发送请求会导致管道字符编码为%7C,但是,该站点仅接受未编码的|
。
我已经用fiddler检查了,并注意到Web浏览器不对管道字符进行编码,那么为什么java库(我猜的URI类)必须对其进行编码? 并且有没有办法在发送请求时强制(或禁用该特定字符的编码)?
答案 0 :(得分:0)
我有一个测试,并使用Jsoup
和URLConnection
发送请求,我注意到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
。