(Java commons-httpclientを使用して)GetMethodにクエリパラメータを追加するにはどうすればよいですか?
-
03-07-2019 - |
質問
Apacheのcommons-httpclient for Javaを使用して、GetMethodインスタンスにクエリパラメータを追加する最良の方法は何ですか? PostMethodを使用している場合、非常に簡単です:
PostMethod method = new PostMethod();
method.addParameter("key", "value");
GetMethodには" addParameter"がありませんしかし、方法。これが機能することを発見しました:
GetMethod method = new GetMethod("http://www.example.com/page");
method.setQueryString(new NameValuePair[] {
new NameValuePair("key", "value")
});
しかし、私が見た例のほとんどは、パラメーターをURLに直接ハードコーディングするか、たとえば:
GetMethod method = new GetMethod("http://www.example.com/page?key=value");
またはクエリ文字列をハードコーディングします。例:
GetMethod method = new GetMethod("http://www.example.com/page");
method.setQueryString("?key=value");
これらのパターンのいずれかが優先されますか?そして、なぜPostMethodとGetMethodの間にAPIの不一致があるのですか?そして、他のすべてのHttpMethodParamsメソッドは何のために使用されるのですか?
解決
postメソッドにはpostパラメーターがありますが、 getメソッドにはありません 。
クエリパラメータはURLに埋め込まれます。 HttpClientの現在のバージョンは、コンストラクターで文字列を受け入れます。上記のキーと値のペアを追加する場合は、次を使用できます。
String url = "http://www.example.com/page?key=value";
GetMethod method = new GetMethod(url);
優れた開始チュートリアルは、 Apache Jakarta Commonsページ。
更新:コメントで示唆されているように、NameValuePairは機能します。
GetMethod method = new GetMethod("example.com/page");
method.setQueryString(new NameValuePair[] {
new NameValuePair("key", "value")
});
他のヒント
それは単に個人的な好みの問題ではありません。ここで関連する問題は、パラメーター値をURLエンコードすることです。これにより、値が破損したり、余分な区切り文字などとして誤って解釈されたりすることはありません。
いつものように、APIドキュメントを詳しく読むことをお勧めします。 HttpClient APIドキュメント
これを読むと、 setQueryString(String)
がURLエンコードまたはパラメーターの区切りを行わないことがわかります&一方、 setQueryString(NameValuePair [])
は自動的にURLエンコードし、パラメーターの名前と値を区切ります。これは、アンパサンド、等号などが含まれている可能性があるため、動的データを使用する場合は常に最適な方法です。
この方法で試してください:
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());