web-dev-qa-db-ja.com

GetMethodにクエリパラメータを追加するには(Java commons-httpclient)を使用しますか?]

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メソッドは何のために使用されることを意図していますか?

32
Ross

Postメソッドにはpostパラメーターがありますが、 getメソッドにはありません

クエリパラメータはURLに埋め込まれます。 HttpClientの現在のバージョンは、コンストラクターで文字列を受け入れます。上記のキーと値のペアを追加する場合は、次を使用できます。

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

適切な開始チュートリアルは Apache Jakarta Commonsページ にあります。

Update:コメントで示唆されているように、NameValuePairは機能します。

GetMethod method = new GetMethod("example.com/page"); 
method.setQueryString(new NameValuePair[] { 
    new NameValuePair("key", "value") 
}); 
22
Ryan Guest

個人的な好みの問題ではありません。ここで関連する問題は、パラメーター値がURLエンコードされているため、値が破損したり、余分な区切り文字などとして誤って解釈されたりしないようにすることです。

いつものように、APIドキュメントを詳細に読むのが最善です: HttpClient API Documentation

これを読むと、setQueryString(String)はパラメーターと値のURLエンコードまたは区切りを行わないのに対し、setQueryString(NameValuePair[])はパラメーターの名前と値のURLエンコードと区切りを自動的に行います。これは、アンパサンド、等号などが含まれる可能性があるため、動的データを使用する場合は常に最適な方法です。

17
Steve Jones

この方法で試してください:

    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());
8
Randal Harleigh