46

I am building a String with StringBuilder

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

Then i build a Url

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

And then i try the connection

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

But the url seems not to be right from the results i get. It's like some parameter is being false passed. That's why i think the problem is in the part of the StringBuilder.

The problem is in a double parameter i try to pass.

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

And then i put it in the url. But if i give it as a string the result is correct.

String lng = "23.433114"

Is UrlEncoding necessary? I will try what is suggested below.

14
  • You should be using a library which does URI Templates (see here for example) Commented Oct 29, 2014 at 22:36
  • 1
    @RealSkeptic URLEncoder.encode() encodes for application/x-www-form-urlencoded`, which is quite different from encoding query parameters/URI fragments/etc Commented Oct 29, 2014 at 22:38
  • 1
    @fge No, URLencode is a standard encoding scheme. It is used both for parameters in GET queries and for parameters in POST queries which are application/x-www-form-urlencoded. See Wikipedia. Commented Oct 29, 2014 at 22:46
  • 1
    @RealSkeptic @EJP sorry but that's wrong. In query parameters, for instance, a space becomes %20; as I said, the method you mention encodes for forms in which the space becomes +. And that is only one example Commented Oct 29, 2014 at 22:48
  • 1
    @fge - try both of them in a query. You'll be surprised. + Is an acceptable replacement for space in GET queries. But if you don't believe Wikipedia, Try The HTML Spec Commented Oct 29, 2014 at 22:54

3 Answers 3

102

Try apache's URIBuilder : [Documentation]

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:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.1</version>
</dependency>
Sign up to request clarification or add additional context in comments.

2 Comments

Works flawlessly. The only problem is that it throws checked exceptions which are boring to handle.
They are boring to be captured like any other exceptions.. nope? :)
4

Since you want to create the URL and consume it through a GET request, it would be better to use a library that helps you in this process. You can use HttpComponents or another library like Unirest that is built on top of HttpComponents which ease all this work.

Here's an example using Unirest:

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

This will retrieve the HTML response corresponding to all the results from a search on youtube using "eñe". The ñ character will be encoded for you.

DISCLAIMER: I'm not attached to Unirest in any mean. I'm not a developer or a sponsor of this project. I'm only a happy user of this framework.

1 Comment

Hey, Its qute late but can we pass value .field("search_query", "eñe") in get request??
1

And another option, this time using Spring framework (especially useful when doing some automated tests)

UriComponentsBuilder.newInstance()
                .scheme(URIScheme.HTTP.getId())
                .host("host")
                .port(8000)
                .path("/employee")
                .pathSegment("{employeeName}", "{anotherThing}")
                // this build(xxx) will automatically perform encoding
                .build("John", "YetMoreData")
                .toURL();

2 Comments

The lillte problem with this tool is that not all special characters are encoded. For instance plus signs in query params are not encoded!
Hum, didn't know that. Maybe this method does what you spoke about? docs.spring.io/spring-framework/docs/current/javadoc-api/org/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.