de-vraag
  • Pytania
  • Tagi
  • Użytkownicy
Powiadomienia
Nagrody
Rejestracja
Po zarejestrowaniu się, będziesz otrzymywać powiadomienia o odpowiedziach i komentarzach do swoich pytań.
Zaloguj się
Brak tłumaczeń pasujących do Twojego wyszukiwania Jeśli masz już konto, zaloguj się, aby sprawdzić nowe powiadomienia.
Za dodane pytania, odpowiedzi i komentarze przewidziane są nagrody.
Więcej
Źródło
Edytuj
 user1277546
user1277546
Question

Kodowanie parametrów łańcuchów zapytań w Java URL

Powiedzmy, że mam adres URL

http://example.com/query?q=

i mam zapytanie wprowadzone przez użytkownika, takie jak:

losowe słowo £500 bank $

Chcę, aby wynik był poprawnie zakodowanym adresem URL:

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

Jaki jest najlepszy sposób, aby to osiągnąć? Próbowałem URLEncoder i tworzenie obiektów URI/URL, ale żaden z nich nie wyszedł całkiem dobrze.

668 2012-05-28T14:10:45+00:00 3
 Abdull
Abdull
Edytowane pytanie 23. listopada 2016 в 4:39
Programowanie
encoding
http
java
url
urlencode
To pytanie ma 1 odpowiedź w języku angielskim, aby je przeczytać zaloguj się na swoje konto.
Solution / Answer
 BalusC
BalusC
28. maja 2012 в 2:15
2012-05-28T14:15:36+00:00
Więcej
Źródło
Edytuj
#16296514

URLEncoder powinien być drogą do zrobienia. Musisz tylko pamiętać, aby kodować tylko poszczególne nazwy i/lub wartości parametrów łańcucha zapytania, nie cały URL, na pewno nie znak separatora parametrów łańcucha zapytania & ani znak separatora nazwa-wartość =.

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

Zauważ, że spacje w parametrach zapytania są reprezentowane przez +, a nie %20, co jest prawnie poprawne. %20 jest zwykle używane do reprezentowania spacji w samym URI (część przed znakiem separatora łańcuchów zapytań URI ?), nie w łańcuchach zapytań (część po ?).

Zauważ również, że istnieją dwie metody encode(). Jedna bez argumentu charset i druga z. Ta bez argumentu charset jest zdeprecjonowana. Nigdy jej nie używaj i zawsze podawaj argument charset. The javadoc nawet wyraźnie zaleca używanie kodowania UTF-8, jak nakazuje RFC3986 i W3C.

Wszystkie inne znaki nie są bezpieczne i są najpierw konwertowane na jeden lub więcej bajtów przy użyciu jakiegoś schematu kodowania. Następnie każdy bajt jest reprezentowany przez trzyznakowy łańcuch "%xy", gdzie xy jest dwucyfrową szesnastkową reprezentacją bajtu. Zalecanym schematem kodowania jest UTF-8. Jednakże, ze względu na kompatybilność, jeśli kodowanie nie jest określone, to używane jest domyślne kodowanie platformy.

Zobacz także:

  • Co każdy web developer musi wiedzieć o kodowaniu adresów URL.
 bplpu
bplpu
Edytowana odpowiedź 14. stycznia 2016 в 7:59
1106
0
Adam Gent
Adam Gent
25. kwietnia 2013 в 11:04
2013-04-25T23:04:14+00:00
Więcej
Źródło
Edytuj
#16296515

Nie używałbym URLEncoder. Poza tym, że jest niepoprawnie nazwany (URLEncoder nie ma nic wspólnego z URLami), nieefektywny (używa StringBuffer zamiast Buildera i robi kilka innych rzeczy, które są powolne) to jeszcze zbyt łatwo go spieprzyć.

Zamiast tego użyłbym URIBuilder lub Spring's org.springframework.web.util.UriUtils.encodeQuery lub Commons Apache HttpClient. Powodem jest to, że musisz uciec nazwę parametrów zapytania (tj. BalusC's odpowiedź q) inaczej niż wartość parametru.

Jedynym minusem powyższego (który odkryłem boleśnie) jest to, że URL's nie są prawdziwym podzbiorem URI's.

Przykładowy 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

Ponieważ łączę się z innymi odpowiedziami, oznaczyłem to jako wiki społeczności. Czuj się swobodnie do edycji.

 Roland
Roland
Edytowana odpowiedź 17. lipca 2017 в 11:39
162
0
Emmanuel Touzery
Emmanuel Touzery
4. grudnia 2013 в 1:18
2013-12-04T13:18:07+00:00
Więcej
Źródło
Edytuj
#16296516

Guava 15 ma teraz dodany zestaw prostych uciekinierów URL.

Emmanuel Touzery
Emmanuel Touzery
Edytowana odpowiedź 15. czerwca 2017 в 8:34
34
0
Dodaj pytanie
Kategorie
Wszystkie
Technologia
Kultura / Rekreacja
Życie / Sztuka
Nauka
Profesjonalny
Biznes
Użytkownicy
Wszystkie
Nowy
Popularny
1
365
Zarejestrowany 1 dzień temu
2
True Image
Zarejestrowany 1 dzień temu
3
archana agarwal
Zarejestrowany 3 dni temu
4
Maxim Zhilyaev
Zarejestrowany 6 dni temu
5
adambotsfford adambotsfford
Zarejestrowany 1 tydzień temu
BG
DE
EL
ES
FR
ID
IT
JA
KO
LT
LV
NL
PL
PT
RU
TR
ZH
© de-vraag 2022
Źródło
stackoverflow.com
na podstawie licencji cc by-sa 3.0 z przypisaniem