2017-06-03 94 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