问题
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?
回答1:
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")
});
回答2:
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.
回答3:
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());
来源:https://stackoverflow.com/questions/217070/how-do-i-add-query-parameters-to-a-getmethod-using-java-commons-httpclient