Ano, je lepší to udělat před dekódováním, tohle mi nedošlo. Taky je pravda, že může být více parametrů stejného jména, takže tady je lepší verze :-)
public static HashMap<String, List<String>> parseURIQuery(URI uri) throws
UnsupportedEncodingException {
HashMap<String, List<String>> map = new HashMap<String, List<String>>();
String query = uri.getRawQuery();
for (String s : query.split("&")) {
String[] par = s.split("=");
String key = URLDecoder.decode(par[0], "utf-8");
String value = (par.length > 1) ? URLDecoder.decode(par[1],
"utf-8") : "";
List<String> strings = map.get(key);
if (strings == null) {
strings = new ArrayList<String>();
map.put(key, strings);
}
strings.add(value);
}
return map;
}
public static void main(String[] args) throws URISyntaxException,
UnsupportedEncodingException {
String jedovate = URLEncoder.encode(".=&š", "utf-8");
URI uri = new URI("http://www.neco.cz/hu?a=1&b=c+2%20d&d&b=" +
jedovate);
System.out.println("uri: " + uri.toString());
HashMap<String, List<String>> map = parseURIQuery(uri);
System.out.println("map = " + map);
}
Makub
Lukáš Zapletal napsal(a):
> Dotaz:
>
> String[] par = URLDecoder.decode(s,"utf-8").split("=");
>
> neni bezpecnejsi udelat rozdeleni podle rovnitka uz pred dekodovanim?
> Teoreticky by mohl byt v klici znak rovnitka, tudiz by doslo k chybne
> interpretaci. Tj.
>
> String sss[] = s.split("=")
> String par0 = URLDecoder.decode(sss[0],"utf-8");
> String par1 = URLDecoder.decode(sss[1],"utf-8");
>
> LZ
>
>
> Dne 20. říjen 2008 11:15 Martin Kuba <[EMAIL PROTECTED]> napsal(a):
>> Lukáš Zapletal napsal(a):
>>> Zdravim,
>>>
>>> potreboval bych najit v Java Core API kod, ktery mi z URI.getQuery
>>> (resp. getRawQuery) vrati nejakou mapu nebo neco, abych si mohl cist
>>> jednotlive parametry. Nechce se mi to (parser) psat, nebo pouzit cizi
>>> kod. Vim, ze je to trivialni, ale musely by se napsat testy a zcela
>>> jiste by to nejaky cas trvalo. Urcite to nekde uz je hotove (minimalne
>>> v Servlet API), jen bych potreboval nasmerovat, kde :-)
>> K tomuto jednu poznámku - není definováno, jak jsou parametry odděleny,
>> takže taková metoda nemůže být univerzální.
>>
>> RFC 3986 definující URI parametry nedefinuje.
>>
>> Ve specifikaci HTML je uvedeno, že prohlížeče mají data z HTML formulářů
>> posílat ve tvaru parametr=hodnota oddělené znakem &
>> (viz http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4)
>> ale ve stejné specifikaci je na jiném místě napsáno,
>> že parametry předávané v URI by měly používat něco jiného
>> než &, nejlépe středníky ;, viz
>> http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.2.2
>>
>> Z tohoto zmatku vyplynulo, že server-side frameworky používají
>> jako oddělovač &, protože to posílají prohlížeče z formulářů
>> předávaných GET. Ale jsou vývojáři (třeba u nás vývojáři IS MU),
>> kteří používají v URL jako oddělovač zásadně středníky
>> (parsují parametry totiž ručně v Perlu).
>>
>> Čili nelze se obecně spolehnout na to, že parametry v URI
>> budou mít určitý oddělovač. Pokud se rozhodnete, že chcete
>> povolit jenom ampersandy, pak by mělo stačit
>>
>>
>> public static HashMap<String, String> parseURIQuery(URI uri) throws
>> UnsupportedEncodingException {
>> HashMap<String,String> map = new HashMap<String, String>();
>> String ss = uri.getQuery();
>> for(String s: ss.split("&")) {
>> String[] par = URLDecoder.decode(s,"utf-8").split("=");
>> map.put(par[0],par.length>1?par[1]:"");
>> }
>> return map;
>> }
>>
>> public static void main(String[] args) throws URISyntaxException,
>> UnsupportedEncodingException {
>>
>> URI uri = new URI("http://www.neco.cz/hu?a=1&b=c+2%20d&d");
>>
>> HashMap<String, String> map = parseURIQuery(uri);
>>
>> System.out.println("map = " + map);
>> }
>>
>> Jo, ještě taky URI nemají definováno kódování, ale utf-8 je doporučeno.
>>
>>
>> Makub
>> --
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> Supercomputing Center Brno Martin Kuba
>> Institute of Computer Science email: [EMAIL PROTECTED]
>> Masaryk University http://www.ics.muni.cz/~makub/
>> Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775
>> --------------------------------------------------------------
>>
>>
>
>
>
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Supercomputing Center Brno Martin Kuba
Institute of Computer Science email: [EMAIL PROTECTED]
Masaryk University http://www.ics.muni.cz/~makub/
Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775
--------------------------------------------------------------
smime.p7s
Description: S/MIME Cryptographic Signature
