Sorgu dizesi parametrelerinin Java URL kodlaması
Diyelim ki bir URL'im var
http://example.com/query?q=
ve kullanıcı tarafından girilen bir sorgu var:
rastgele kelime £500 banka $
Sonucun düzgün kodlanmış bir URL olmasını istiyorum:
http://example.com/query?q=random%20word%20%A3500%20bank%20%24
Bunu başarmanın en iyi yolu nedir? URLncoder`ı ve URI/URL nesneleri oluşturmayı denedim ama hiçbiri doğru çıkmadı.
668
3
URLEncoder
gidilecek yol olmalıdır. Yalnızca sadece sorgu dizesi parametre adını ve/veya değerini kodlamayı aklınızda tutmanız gerekir, URL'nin tamamını değil, kesinlikle sorgu dizesi parametre ayırıcı karakteri&
veya parametre adı-değer ayırıcı karakteri=
değil.Sorgu parametrelerindeki boşlukların yasal olarak geçerli olan
%20
ile değil+
ile temsil edildiğini unutmayın. 20genellikle URI'nin kendisinde (URI-sorgu dizesi ayırıcı karakteri
?'den önceki kısım) boşlukları temsil etmek için kullanılır, sorgu dizesinde (
?`'den sonraki kısım) değil.Ayrıca iki
encode()
yöntemi olduğunu da unutmayın. Biri charset argümanı olmadan ve diğeri ile. Charset bağımsız değişkeni olmayan yöntem kullanımdan kaldırılmıştır. Asla kullanmayın ve her zaman charset argümanını belirtin. Hatta javadoc, RFC3986 ve W3C tarafından zorunlu kılındığı gibi UTF-8 kodlamasının kullanılmasını açıkça önermektedir.Ayrıca bakınız:
Ben olsam
URLEncoder
kullanmazdım. Yanlış adlandırılmış olmasının yanı sıra (URLEncoder
ın URLlerle hiçbir ilgisi yoktur), verimsizdir (Builder yerine
StringBuffer` kullanır ve yavaş olan birkaç şey daha yapar) Ayrıca onu mahvetmek çok kolaydır.Bunun yerine
URIBuilder
veya Spring'sorg.springframework.web.util.UriUtils.encodeQuery
veya Commons ApacheHttpClient
kullanırdım. Bunun nedeni, sorgu parametrelerinin adını (yani BalusC'nin cevabıq
) parametre değerinden farklı bir şekilde kaçmanız gerektiğidir.Yukarıdakilerin tek dezavantajı (acı bir şekilde öğrendiğim) URL'lerin URI'lerin gerçek bir alt kümesi olmamasıdır.
Örnek kod:
Sadece diğer cevaplara bağlantı verdiğim için bunu bir topluluk vikisi olarak işaretledim. Düzenlemekten çekinmeyin.
Guava 15 şimdi bir dizi basit URL escaper ekledi.