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ı.

Çözüm

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.

String q = "random word £500 bank $";
String url = "http://example.com/query?q=" + URLEncoder.encode(q, "UTF-8");

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.

Diğer tüm karakterler güvenli değildir ve önce bir kodlama şeması kullanılarak bir veya daha fazla bayta dönüştürülür. Daha sonra her bayt 3 karakterli "%xy" dizesi ile temsil edilir, burada xy baytın iki basamaklı onaltılık gösterimidir. Kullanılması önerilen kodlama şeması UTF-8'dir. Ancak, uyumluluk nedenleriyle, bir kodlama belirtilmezse, platformun varsayılan kodlaması kullanılır.

Ayrıca bakınız:

Yorumlar (11)

Ben olsam URLEncoder kullanmazdım. Yanlış adlandırılmış olmasının yanı sıra (URLEncoderın URLlerle hiçbir ilgisi yoktur), verimsizdir (Builder yerineStringBuffer` kullanır ve yavaş olan birkaç şey daha yapar) Ayrıca onu mahvetmek çok kolaydır.

Bunun yerine URIBuilder veya Spring's org.springframework.web.util.UriUtils.encodeQuery veya Commons Apache HttpClient 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:

import org.apache.http.client.utils.URIBuilder;

URIBuilder ub = new URIBuilder("http://example.com/query");
ub.addParameter("q", "random word £500 bank \$");
String url = ub.toString();

// Result: http://example.com/query?q=random+word+%C2%A3500+bank+%24

Sadece diğer cevaplara bağlantı verdiğim için bunu bir topluluk vikisi olarak işaretledim. Düzenlemekten çekinmeyin.

Yorumlar (9)