2011-03-16 100 views
75

如何編碼查詢參數以在Java中使用url?我知道,這似乎是一個顯而易見的問題。使用Java編碼URL查詢參數

有兩個微妙之處我不知道的:

  1. 如果空間上的網址爲「+」或「%20」編碼?在Chrome瀏覽器中,如果我輸入「http://google.com/foo=?bar me」,Chrome會將其更改爲使用%編碼20
  2. 是否需要/正確地將冒號「:」編碼爲%3B? Chrome沒有。

注:

  • java.net.URLEncoder.encode似乎不工作,它似乎是要提交表單數據編碼。例如,它將空間編碼爲+而不是%20,並對不需要的冒號進行編碼。
  • java.net.URI不編碼查詢參數
+0

這個問題看起來有用:http://stackoverflow.com/questions/444112/how-do-i-編碼-URI - 對參數值 – 2011-03-16 19:14:43

+2

查詢部分的結構依賴於服務器,儘管大多數人期望'application/x-www-form-urlencoded'鍵/值對。在這裏看到更多:http://illegalargumentexception.blogspot.com/2009/12/java-safe-character-handling-and-url.html – McDowell 2011-03-16 20:18:00

回答

88

java.net.URLEncoder.encode(String s, String encoding)也可以提供幫助。它遵循HTML表單編碼application/x-www-form-urlencoded

URLEncoder.encode(query, "UTF-8"); 

在另一方面,Percent-encoding(也稱爲URL encoding)與%20編碼空間。冒號是一個保留字符,因此編碼後:仍然是冒號。

+2

我提到,我沒有想到,URL編碼,而是它編碼的數據通過表單提交。註釋? – 2011-03-16 18:50:06

+0

這是因爲URLEncoder符合application/x-www-form-urlencoded的MIME格式(這是一種有效的HTML表單編碼)。我假設這不是你想要的。 – 2011-03-16 18:54:10

+0

對,那麼這不會使你的答案不合格?或者,你是說它的輸出仍然有效,只是比必要更嚴格? – 2011-03-16 18:55:03

14

編輯:URIUtil不再在最近的版本,更好的答案在Java - encode URL或辛迪先生在這個線程。


的Apache的HttpClient URIUtil是真正有用的,雖然有一些alternatives

URIUtil.encodeQuery(url); 

例如,它編碼空間爲 「+」,而不是 「%20」

兩者都是perfectly valid in the right context。雖然如果你真的喜歡,你可以發出一個字符串替換。

+0

我不得不同意。使用HttpClient,你會更快樂。 – DaShaun 2011-03-16 18:44:35

+0

這看起來很有希望,偶然得到了一個鏈接?我使用谷歌搜索,但發現很多。 – 2011-03-16 18:44:35

+0

這個方法似乎並不存在於HttpClient 4.1中? http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URIUtils.html – 2011-03-16 18:49:01

7

在查詢中不需要將冒號作爲%3B進行編碼,儘管這樣做不是非法的。

URI   = scheme ":" hier-part [ "?" query ] [ "#" fragment ] 
query  = *(pchar/"/"/"?") 
pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 
unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~" 
pct-encoded = "%" HEXDIG HEXDIG 
sub-delims = "!"/"$"/"&"/"'"/"("/")"/"*"/"+"/","/";"/"=" 

這也似乎只有百分之編碼的空間是有效的,因爲我懷疑,空間是一個字母或一個數字

外觀the URI specification瞭解更多詳情。

+0

但是這樣做可以改變URI的含義,因爲查詢字符串的解釋取決於服務器。如果你正在生成一個'application/x-www-form-urlencoded'查詢字符串,那麼就好。如果您正在修改用戶鍵入/粘貼的URL,則應單獨保留':'。 – 2013-03-26 18:44:46

+0

@tc。如果冒號被用作通用分隔符(RFC第12頁),那麼你是對的;然而,如果它沒有被用作一個普通的分隔符,那麼這兩種編碼應該以相同的方式解決。 – 2013-03-27 21:24:34

+0

你也必須小心,因爲URL並不是URI的子集:http://adamgent.com/post/25161273526/urls-are-not-a-subset-of-uris – 2013-04-25 22:51:04

3

內置的Java URLEncoder正在做它應該做的,你應該使用它。

「+」或「%20」是均爲有效替換URL中的空格字符。任何一個都可以工作。

一個「:」應該被編碼,因爲它是一個分隔符。即http://fooftp://bar。事實上,一個特定的瀏覽器可以處理它,當它沒有編碼並不能使它正確。你應該編碼它們。

作爲一個良好的做法,一定要使用帶有字符編碼參數的方法。 UTF-8通常在那裏使用,但您應該明確提供它。

URLEncoder.encode(yourUrl, "UTF-8"); 
+4

'+'只是一個表示'application/x-www-form-urlencoded'中的空間即使限於HTTP,也不保證能夠正常工作。同樣,':'在查詢字符串中有效*和*不應該轉換爲'%3B';服務器可以選擇以不同的方式解釋它們。 – 2013-03-26 18:38:49

+1

此方法也編碼整個網址斜線和其他字符,例如'http://'到'http%3A%2F%2F'這是不正確的部分 – 2015-05-22 10:47:13

+0

@ToKra你不應該編碼'http:// '部分。該方法用於查詢參數和編碼形式的數據。但是,如果您想將另一個網站的URL作爲查詢參數傳遞,那麼您需要對其進行編碼以避免混淆URL解析器。 – beldaz 2016-07-15 10:00:36

7

不幸的是,URLEncoder.encode()不產生編碼有效百分比(如在http://tools.ietf.org/html/rfc3986#section-2.1指定)。

URLEncoder.encode()編碼一切都很好,除了空間編碼爲「+」。我能找到的所有Java URI編碼器都只公開方法來對查詢,片段,路徑部分等進行編碼 - 但不公開「原始」編碼。這是不幸的,因爲片段和查詢被允許將空間編碼爲+,所以我們不想使用它們。路徑編碼正確,但首先是「標準化」,因此我們不能將其用於「通用」編碼。

我可以拿出最好的解決辦法:

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20"); 

如果replaceAll()是你太慢了,我想另一種方法是推出自己的編碼器...

編輯:我有這個代碼在這裏先不編碼, 「&」, 「=」 正常 「?」:

//don't use - doesn't properly encode "?", "&", "=" 
new URI(null, null, null, raw, null).toString().substring(1); 
+0

'+'是一個完全有效的空間編碼。 – 2015-12-15 23:00:39

+0

@ LawrenceDol這是真的,但有時'+'可能會被錯誤地解釋 - 請看看C#https://blogs.msdn.microsoft.com/yangxind/2006/11/08/dont-use-net-system-uri- unescapedatastring-in-url-decoding/ – Lu55 2016-04-14 08:42:05

+0

這個。我根據Javascript的'encodeURIComponent'方法輸出比較了各種替代方法,這是我嘗試過的(與空格,土耳其和德國特殊字符查詢)唯一完全匹配。 – 2017-11-27 10:43:37