2015-04-24 11 views
6

Wysyłam poniższy adres URL z ciągiem zapytania. W ciągu zapytania jeden parametr "approverCmt" ma wartość z hash (#).Co to jest zachowanie skrótu (#) w ciągu zapytania

"/abc/efd/xyz.jas?approverCmt=Transaction Log #459505&batchNm=XS_10APR2015_082224&mfrNm=Timberland" 

Na stronie serwera kiedy próbował je odzyskać z żądania uzyskać

approverCmt = Transaction Log -----> "#459505" is missing 
    batchNm = null 
    mfrNm = null 

i jeśli usunąć hash (#) z łańcucha zapytania lub Gdybym zastąpić # z% 23 co roboty Rzecz grzywny

Nie rozumiem, dlaczego otrzymuję null dla jednego parametru, jeśli inny parametr zawiera symbol krzyżyka (#).

Doceń, jeśli ktoś może wyjaśnić.

+0

Zobacz [to pytanie] (http://stackoverflow.com/questions/20280212/getting-the-full-url-include-the-query-string-after-hash) –

Odpowiedz

10

Jest to tak zwany "identyfikator fragmentu".

Jak wspomniano w wikipedia:

fragment identifier wprowadzone przez znak hash # jest opcjonalny ostatnią częścią URL dla dokumentu. Zazwyczaj służy do identyfikacji części tego dokumentu.

Część po # jest informacją o client. Nie jest wysyłane na serwer. Umieść tutaj wszystko, czego potrzebuje tylko przeglądarka.

Możesz użyć funkcji encodeURIComponent() w języku JavaScript, aby kodować znaki specjalne w adresie URL, dzięki czemu znaki # zostaną przekonwertowane na inne znaki, dzięki czemu możesz mieć pewność, że cały adres URL zostanie wysłany na serwer.

+4

Warto również wspomnieć o wszystkim po tym znaku (jeśli nie kodowane) nie jest wysyłane na serwer i działa tylko po stronie klienta, co wyjaśnia problem PO. –

+0

@Bartdude: dzięki za wskazanie. dodałem także tę część. – Prashant

2

Wartość Hash jest na kotwicy, więc jest tylko po stronie klienta, jest on często stosowany w po stronie klienta ram jak kanciasty do routingu po stronie klienta.

Kotwica NIE jest dostępna po stronie serwera.

W twoim przypadku nie potrzebujesz kotwicy, ale wartość parametru z # przerwą ciąg zapytania ma wartość "Dziennik transakcji # 459505".

EDIT Naiwne rozwiązanie, które nie działa, tylko niech to Ther dla historii, zobaczyć prawdziwą rozwiązanie poniżej

Rozwiązaniem jest do kodowania po stronie klienta i po stronie dekodowania serveur

Kodowanie w javascript

encodeURI("Transaction Log #459505") 
    //result value "Transaction%20Log%20#459505" 

Decode w Javie

java.net.URLDecoder.decode("Transaction%20Log%20#459505"); 
    //result "Transaction Log #459505" 

EDIT : Ale: Javascript nie koduje w taki sam sposób jak Java Tak więc poprawną odpowiedzią (mam nadzieję) jest ręczne zastąpienie wszystkich # z% 23, następnie Java będzie ją dekodować normalnie lub użyć encodeURIC Component zgodnie z sugestiami w komentarzach. Dla twojej potrzeby zastąpienie rozwiązania wydaje się wystarczające.

Koduje w JavaScript:

encodeURI("yourUrl/Transaction Log #459505").replace(/#/,"%23") 
//result: yourUrl/Transaction%20Log%20%23459505 

dekodowania w Javie nie zmienia

java.net.URLDecoder.decode("Transaction%20Log%20#459505") 
// result (java.lang.String) Transaction Log #459505 

Przepraszam za długi post, nie widzę różnicy bettween Java i JavaScrip Url kodowania

+1

'encodeURI' nie będzie działał dla' /? : @ & = + $ # 'musisz użyć' encodeURIComponent' – Prashant

+0

Thancks: tak Stange zachowanie jest inne w Javie i Javascriptie, zaktualizuję moją odpowiedź – pdem