33

Using Apache's commons-httpclient for Java, what's the best way to add query parameters to a GetMethod instance? If I'm using PostMethod, it's very straightforward:

PostMethod method = new PostMethod();
method.addParameter("key", "value");

GetMethod doesn't have an "addParameter" method, though. I've discovered that this works:

GetMethod method = new GetMethod("http://www.example.com/page");
method.setQueryString(new NameValuePair[] {
    new NameValuePair("key", "value")
});

However, most of the examples I've seen either hard-code the parameters directly into the URL, e.g.:

GetMethod method = new GetMethod("http://www.example.com/page?key=value");

or hard-code the query string, e.g.:

GetMethod method = new GetMethod("http://www.example.com/page");
method.setQueryString("?key=value");

Is one of these patterns to be preferred? And why the API discrepancy between PostMethod and GetMethod? And what are all those other HttpMethodParams methods intended to be used for?

Ross
  • 9,652
  • 8
  • 35
  • 35

3 Answers3

22

Post methods have post parameters, but get methods do not.

Query parameters are embedded in the URL. The current version of HttpClient accepts a string in the constructor. If you wanted to add the key, value pair above, you could use:

String url = "http://www.example.com/page?key=value";
GetMethod method = new GetMethod(url);

A good starting tutorial can be found on the Apache Jakarta Commons page.

Update: As suggested in the comment, NameValuePair works.

GetMethod method = new GetMethod("example.com/page"); 
method.setQueryString(new NameValuePair[] { 
    new NameValuePair("key", "value") 
}); 
Christophe Roussy
  • 16,299
  • 4
  • 85
  • 85
Ryan Guest
  • 6,080
  • 2
  • 33
  • 39
  • 7
    I discovered that this works: GetMethod method = new GetMethod("http://www.example.com/page"); method.setQueryString(new NameValuePair[] { new NameValuePair("key", "value") }); This isn't mentioned on the tutorial page, however. Should this pattern be avoided? – Ross Oct 19 '08 at 22:54
  • Hm, apparently you can't put code blocks in comments, so I've edited my question to add that example and others. – Ross Oct 19 '08 at 23:01
18

It's not just a matter of personal preference. The pertinent issue here is URL-encoding your parameter values, so that the values won't get corrupted or misinterpreted as extra delimiters, etc.

As always, it is best to read the API documentation in detail: HttpClient API Documentation

Reading this, you can see that setQueryString(String) will NOT URL-encode or delimit your parameters & values, whereas setQueryString(NameValuePair[]) will automatically URL-encode and delimit your parameter names and values. This is the best method whenever you are using dynamic data, because it might contain ampersands, equal signs, etc.

Parvin Gasimzade
  • 25,180
  • 8
  • 56
  • 83
Steve Jones
  • 1,528
  • 19
  • 12
10

Try it this way:

    URIBuilder builder = new URIBuilder("https://graph.facebook.com/oauth/access_token")
            .addParameter("client_id", application.getKey())
            .addParameter("client_secret", application.getSecret())
            .addParameter("redirect_uri", callbackURL)
            .addParameter("code", code);

    HttpPost method = new HttpPost(builder.build());
Ahamed
  • 39,245
  • 13
  • 40
  • 68
Randal Harleigh
  • 101
  • 1
  • 2