我试图发送一个请求到使用管道字符在其URL site.com/page?param=|||
上的http请求管道符禁用编码
发送同时使用Jsoup和URLConnection这个URL请求的URL会导致管字符编码为%7C,不过,该网站只接受未编码|
。
我与小提琴手检查,发现Web浏览器不编码的管道字符,那么为什么Java库(URI类我猜)的编码呢? 和有没有办法发送请求时,迫使(或禁用编码该特定字符)?
我试图发送一个请求到使用管道字符在其URL site.com/page?param=|||
上的http请求管道符禁用编码
发送同时使用Jsoup和URLConnection这个URL请求的URL会导致管字符编码为%7C,不过,该网站只接受未编码|
。
我与小提琴手检查,发现Web浏览器不编码的管道字符,那么为什么Java库(URI类我猜)的编码呢? 和有没有办法发送请求时,迫使(或禁用编码该特定字符)?
我有一个测试,并通过使用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
。这互联网是HTTP数据包,而使用Jsoup
:
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
的FPGA实现在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;
}
}
的URL编码发生在final URI uri = new URI(u.getProtocol(), u.getUserInfo(), u.getHost(), u.getPort(), u.getPath(), u.getQuery(), u.getRef());
,并且没有属性来控制在Jsoup
编码或不。
所以我觉得你可以使用URLConnection
而非Jsoup
。