33

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 メソッドは何のために使用されるのでしょうか?

4

3 に答える 3

22

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

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

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

優れた開始チュートリアルは、ApacheJakartaCommonsページにあります。

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

GetMethod method = new GetMethod("example.com/page"); 
method.setQueryString(new NameValuePair[] { 
    new NameValuePair("key", "value") 
}); 
于 2008-10-19T22:49:23.973 に答える
18

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

いつものように、API ドキュメントを詳細に読むことをお勧めします: HttpClient API ドキュメント

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

于 2010-08-09T19:08:09.193 に答える
10

このようにしてみてください:

    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());
于 2012-10-23T15:10:04.833 に答える