2014-10-29 15 views
23

buduję ciąg z StringBuilderJak zbudować adres URL w języku Java?

StringBuilder builder = new StringBuilder(); 
builder.append("my parameters"); 
builder.append("other parameters"); 

potem zbudować URL

Url url = new Url(builder.toString()); 

a potem spróbować połączenia

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

Ale url nie wydaje się być w porządku z wyniki, które otrzymuję. To tak, jakby niektóre parametry były błędnie przekazywane. Dlatego myślę, że problem leży w części StringBuilder.

Problem występuje w podwójnym parametrze, który próbuję przekazać.

double longitude = 23.433114; 
String lng = String.ValueOf(longitude); 

A potem umieszczam go w adresie URL. Ale jeśli dam to jako ciąg, wynik jest poprawny.

String lng = "23.433114" 

Czy konieczne jest UrlEncoding? Spróbuję tego, co jest sugerowane poniżej.

+0

Powinieneś używać biblioteki, która zawiera szablony URI (zobacz [tutaj] (https://github.com/fge/uri-template) na przykład) – fge

+1

@RealSkeptic 'URLEncoder.encode()' koduje dla aplikacji/x-www-form-urlencoded', co jest dość różne od kodowania parametrów zapytania/fragmentów URI/itp. – fge

+1

@ fge Nie, kod URL jest standardowym schematem kodowania. Jest używany zarówno do parametrów w zapytaniach GET, jak i do parametrów w zapytaniach POST, które są application/x-www-form-urlencoded. Zobacz [Wikipedia] (http://en.wikipedia.org/wiki/Percent- kodowanie). – RealSkeptic

Odpowiedz

50

Spróbuj URIBuilder Apache: [Documentation] zależność

import org.apache.http.client.utils.URIBuilder; 

// ... 

URIBuilder b = new URIBuilder("http://example.com"); 
b.addParameter("t", "search"); 
b.addParameter("q", "apples"); 

Url url = b.build().toUrl(); 

Maven:

<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpclient</artifactId> 
    <version>4.5.1</version> 
</dependency> 
+6

Działa bezbłędnie. Jedynym problemem jest to, że rzuca sprawdzane wyjątki, które są nudne w obsłudze. –

+0

Są nudne, aby zostać złapanym jak wszystkie inne wyjątki .. nie? :) –

4

Skoro chcesz utworzyć URL i spożywać go poprzez żądanie GET, byłoby lepiej, aby użyć biblioteka, która pomaga w tym procesie. Możesz użyć HttpComponents lub innej biblioteki, takiej jak Unirest, która jest zbudowana na bazie HttpComponents, co ułatwia tę pracę.

Oto przykład przy użyciu Unirest:

HttpResponse<String> stringResponse = Unirest.get("https://www.youtube.com/results") 
    .field("search_query", "eñe") 
    .asString(); 
System.out.println(stringResponse.getBody()); 

To będzie pobierać odpowiedź HTML odpowiedni do wszystkich wyników wyszukiwania w YouTube za pomocą "eñe". Znak ñ zostanie zakodowany dla Ciebie.

OŚWIADCZENIE: W żaden sposób nie jestem przywiązany do Unirest. Nie jestem programistą ani sponsorem tego projektu. Jestem tylko szczęśliwym użytkownikiem tego szkieletu.

+0

Hej, jego qute późno, ale czy możemy przekazać wartość .field ("search_query", "eñe") w żądaniu otrzymania? –

Powiązane problemy