Jak zakodować parametry zapytania, aby przejść do adresu URL w Javie? Wiem, to wydaje się oczywiste i już zadane pytanie.
Są dwie subtelności, których nie jestem pewien:
- Czy spacje powinny być zakodowane w adresie URL jako „+” czy „% 20”? W chrome, jeśli wpiszę „http://google.com/foo=?bar me”, chrome zmieni go na kodowanie z% 20
- Czy konieczne / poprawne jest kodowanie dwukropków „:” jako% 3B? Chrome tego nie robi.
Uwagi:
java.net.URLEncoder.encode
wygląda na to, że nie działa, wydaje się, że kodowanie danych ma być przesłane do formularza. Na przykład koduje spację jako+
zamiast%20
i koduje dwukropek, który nie jest konieczny.java.net.URI
nie koduje parametrów zapytania
application/x-www-form-urlencoded
par klucz / wartość. Zobacz tutaj, aby uzyskać więcej: nielegalneargumentexception.blogspot.com/2009/12/…Odpowiedzi:
java.net.URLEncoder.encode(String s, String encoding)
też może pomóc. Jest zgodny z kodowaniem formularza HTMLapplication/x-www-form-urlencoded
.Z drugiej strony kodowanie procentowe (znane również jako kodowanie adresów URL ) koduje spację za pomocą
%20
. Dwukropek jest znakiem zastrzeżonym, więc:
po zakodowaniu pozostanie dwukropkiem.źródło
URLEncoder
jest zgodny zapplication/x-www-form-urlencoded
formatem MIME (który jest prawidłowym kodowaniem formularza HTML). Zakładam, że nie tego szukasz.http://example.com/?url=http://example.com/?q=c&sort=name
. Powinien kodować&sort=name
czy nie? Nie ma sposobu, aby odróżnić wartość od adresu URL. To jest dokładny powód, dla którego potrzebujesz kodowania wartości w pierwszej kolejności.EDYCJA:
URIUtil
nie jest już dostępna w nowszych wersjach, lepsza odpowiedź w Java - zakoduj URL lub przez pana Sindi w tym wątku.URIUtil
of Apache httpclient jest naprawdę przydatne, chociaż istnieje kilka alternatywOba są doskonale uzasadnione we właściwym kontekście . Chociaż jeśli naprawdę wolisz, możesz wydać zastąpienie ciągu.
źródło
URIUtil.encodeWithinQuery
jest tym, czego użyłbyś do zakodowania indywidualnego parametru zapytania, o co wydawało się pytać oryginalne pytanie.Niestety, URLEncoder.encode () nie generuje prawidłowego kodowania procentowego (jak określono w RFC 3986 ).
URLEncoder.encode () koduje wszystko dobrze, z wyjątkiem spacji zakodowanej na „+”. Wszystkie kodery Java URI, które udało mi się znaleźć, ujawniają tylko publiczne metody kodowania zapytania, fragmentu, części ścieżki itp. - ale nie ujawniają "surowego" kodowania. Jest to niefortunne, ponieważ fragmenty i zapytanie mogą zakodować spację do +, więc nie chcemy ich używać. Ścieżka jest poprawnie zakodowana, ale najpierw jest „znormalizowana”, więc nie możemy jej również użyć do kodowania „ogólnego”.
Najlepsze rozwiązanie, jakie mogłem wymyślić:
Jeśli
replaceAll()
jest dla ciebie za wolny, myślę, że alternatywą jest zrolowanie własnego kodera ...EDYCJA: Najpierw miałem ten kod, który nie koduje poprawnie znaków „?”, „&”, „=”:
źródło
+
jest całkowicie poprawnym kodowaniem spacji.+
może być interpretowane nieprawidłowo - spójrz na C # blogs.msdn.microsoft.com/yangxind/2006/11/08/...encodeURIComponent
wynikami metody Javascript i było to jedyne dokładne dopasowanie do tych, które wypróbowałem (zapytania ze spacjami, tureckimi i niemieckimi znakami specjalnymi).Nie jest konieczne kodowanie dwukropka jako% 3B w zapytaniu, chociaż nie jest to nielegalne.
Wydaje się również, że tylko spacje zakodowane w procentach są prawidłowe, ponieważ wątpię, czy spacja jest ALFA lub CYFRA
więcej szczegółów znajdziesz w specyfikacji URI .
źródło
application/x-www-form-urlencoded
ciąg zapytania, jedno i drugie jest w porządku. Jeśli naprawiasz adres URL, który użytkownik wpisał / wkleił,:
powinien pozostać w spokoju.Wbudowany Java URLEncoder robi to, co powinien i powinieneś go używać.
A „+” lub „% 20” są zarówno ważne zamienniki znak spacji w adresie URL. Każdy z nich zadziała.
Znak „:” powinien być zakodowany, ponieważ jest to znak separatora. tj. http: // foo lub ftp: // bar . Fakt, że dana przeglądarka może to obsłużyć, gdy nie jest zakodowany, nie oznacza, że jest poprawny. Powinieneś je zakodować.
Dobrą praktyką jest używanie metody, która przyjmuje parametr kodowania znaków. UTF-8 jest tam generalnie używany, ale powinieneś podać go wyraźnie.
źródło
+
jest tylko reprezentacją przestrzeni wapplication/x-www-form-urlencoded
; nie ma gwarancji, że będzie działać, nawet jeśli jest ograniczone do protokołu HTTP. Podobnie:
jest poprawny w ciągu zapytania i nie powinien być konwertowany na%3B
; serwer może je interpretować inaczej.http://
dohttp%3A%2F%2F
których nie jest poprawnahttp://
części. Metoda dotyczy parametrów zapytania i zakodowanych danych formularza. Jeśli jednak chciałbyś przekazać adres URL innej witryny jako parametr zapytania, WTEDY chciałbyś go zakodować, aby uniknąć pomylenia parsera URL.application/x-www-form-urlencoded
typ zawartości. Czy to nie znaczy, że musi działać dla HTTP?jeśli masz tylko problem ze spacją w adresie URL. Użyłem poniższego kodu i działa dobrze
przykład: adres URL to
to wyjście muUrl to
źródło
Zauważyłem, że w przypadku Datetime (Timestamp)
URLEncoder.encode(param,"UTF-8")
nie działa.źródło