Περισσότερα
Κωδικοποίηση παραμέτρων συμβολοσειράς ερωτήσεων σε URL της Java
Ας πούμε ότι έχω ένα URL
http://example.com/query?q=
και έχω ένα ερώτημα που εισάγει ο χρήστης, όπως:
τυχαία λέξη £500 bank $
Θέλω το αποτέλεσμα να είναι ένα σωστά κωδικοποιημένο URL:
http://example.com/query?q=random%20word%20%A3500%20bank%20%24
Ποιος είναι ο καλύτερος τρόπος για να το πετύχω αυτό; Δοκίμασα το URLEncoder
και τη δημιουργία αντικειμένων URI/URL αλλά κανένα από αυτά δεν βγαίνει σωστά.
668
3
Το
URLEncoder
θα πρέπει να είναι ο τρόπος που πρέπει να ακολουθήσετε. Το μόνο που πρέπει να έχετε κατά νου είναι να κωδικοποιήσετε μόνο το όνομα ή/και την τιμή της μεμονωμένης παραμέτρου της συμβολοσειράς ερωτήσεων, όχι ολόκληρο το URL, και σίγουρα όχι τον χαρακτήρα διαχωρισμού της παραμέτρου της συμβολοσειράς ερωτήσεων&
ούτε τον χαρακτήρα διαχωρισμού ονόματος-τιμής της παραμέτρου=
.Σημειώστε ότι τα κενά στις παραμέτρους ερωτήματος αναπαρίστανται με
+
και όχι με%20
, το οποίο είναι νόμιμα έγκυρο. Το%20
χρησιμοποιείται συνήθως για την αναπαράσταση κενών στο ίδιο το URI (το μέρος πριν από τον χαρακτήρα διαχωρισμού URI-σειράς ερωτήματος?
), όχι στη συμβολοσειρά ερωτήματος (το μέρος μετά το?
).Σημειώστε επίσης ότι υπάρχουν δύο μέθοδοι
encode()
. Η μία χωρίς το όρισμα charset και η άλλη με. Η μέθοδος χωρίς το όρισμα charset έχει ξεπεραστεί. Ποτέ μην τη χρησιμοποιείτε και να προσδιορίζετε πάντα το όρισμα charset. Το javadoc μάλιστα συνιστά ρητά τη χρήση της κωδικοποίησης UTF-8, όπως επιβάλλεται από το RFC3986 και το W3C.Βλέπε επίσης:
Δεν θα χρησιμοποιούσα τον
URLEncoder
. Εκτός του ότι έχει λανθασμένο όνομα (τοURLEncoder
δεν έχει καμία σχέση με τις διευθύνσεις URL), είναι αναποτελεσματικό (χρησιμοποιεί έναStringBuffer
αντί για Builder και κάνει μερικά άλλα πράγματα που είναι αργά) είναι επίσης πολύ εύκολο να το καταστρέψετε.Αντ' αυτού θα χρησιμοποιούσα το
URIBuilder
ή το Spring'sorg.springframework.web.util.UriUtils.encodeQuery
ή το Commons ApacheHttpClient
. Ο λόγος είναι ότι πρέπει να αποφύγετε το όνομα των παραμέτρων του ερωτήματος (δηλαδή την απάντηση του BalusC'sq
) διαφορετικά από την τιμή της παραμέτρου.Το μόνο μειονέκτημα των παραπάνω (που ανακάλυψα με οδυνηρό τρόπο) είναι ότι τα URL's δεν αποτελούν πραγματικό υποσύνολο των URI's.
Δείγμα κώδικα:
Επειδή απλά συνδέω με άλλες απαντήσεις, σημείωσα αυτό το κείμενο ως wiki της κοινότητας. Μπορείτε ελεύθερα να το επεξεργαστείτε.
Το Guava 15 έχει τώρα προσθέσει ένα σύνολο απλών συνοδών URL.