2017-06-03 56 views
0

我试图发送一个请求到使用管道字符在其URL site.com/page?param=|||上的http请求管道符禁用编码

发送同时使用Jsoup和URLConnection这个URL请求的URL会导致管字符编码为%7C,不过,该网站只接受未编码|

我与小提琴手检查,发现Web浏览器不编码的管道字符,那么为什么Java库(URI类我猜)的编码呢? 和有没有办法发送请求时,迫使(或禁用编码该特定字符)?

回答

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。这互联网是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