views:

6197

answers:

2

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?

+2  A: 

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.

Ryan Guest
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
Hm, apparently you can't put code blocks in comments, so I've edited my question to add that example and others.
Ross
I think it's a matter of personal preference. I can imagine places where it would be better to use the setQueryString pattern and situations where it would be better to hardcode them in the GetMethod constructor. I think you should use what solution works best for you and your style.
Ryan Guest
+1  A: 

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.

Steve Jones