2008-10-19 3 views
32

Mit Apache commons-httpclient für Java, was ist der beste Weg, Abfrageparameter zu einer GetMethod-Instanz hinzuzufügen? Wenn ich PostMethod bin mit, es ist sehr einfach:Wie füge ich einem GetMethod Abfrageparameter hinzu (mit Java commons-httpclient)?

PostMethod method = new PostMethod(); 
method.addParameter("key", "value"); 

GetMethod keine "addParameter" -Methode hat, though. Ich habe entdeckt, dass dies funktioniert:

GetMethod method = new GetMethod("http://www.example.com/page"); 
method.setQueryString(new NameValuePair[] { 
    new NameValuePair("key", "value") 
}); 

jedoch die meisten der Beispiele, die ich gesehen habe, entweder hart Code die Parameter direkt in die URL, zB:

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

oder schwer Code der Abfragezeichenfolge, zB:

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

Ist eines dieser Muster zu bevorzugen? Und warum die API-Diskrepanz zwischen PostMethod und GetMethod? Und wozu dienen alle anderen HttpMethodParams-Methoden?

Antwort

22

Post-Methoden haben Post-Parameter, aber get methods do not.

Abfrageparameter sind in die URL eingebettet. Die aktuelle Version von HttpClient akzeptiert eine Zeichenfolge im Konstruktor. Wenn Sie den Schlüssel, Wert-Paar oben hinzufügen möchten, können Sie verwenden:

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

Ein guter Ausgangs Tutorial auf der Apache Jakarta Commons page finden.

Update: Wie im Kommentar vorgeschlagen, funktioniert NameValuePair.

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

Ich entdeckte, dass dies funktioniert: GetMethod Methode = new GetMethod ("http://www.beispiel.de/seite"); method.setQueryString (new NameValuePair [] { new NameValuePair ("Schlüssel", "Wert") }); Dies wird jedoch nicht auf der Tutorial-Seite erwähnt. Sollte dieses Muster vermieden werden? – Ross

+0

Hm, anscheinend können Sie keine Code-Blöcke in Kommentare setzen, also habe ich meine Frage bearbeitet, um dieses Beispiel und andere hinzuzufügen. – Ross

17

Es ist nicht nur eine Frage der persönlichen Vorlieben. Die relevante Frage ist hier URL-Kodierung der Parameterwerte, so dass die Werte nicht als zusätzliche Trennzeichen beschädigt oder falsch interpretiert bekommen, usw.

Wie immer ist es am besten die API-Dokumentation im Detail zu lesen: HttpClient API Documentation

Wenn Sie dies lesen, können Sie sehen, dass setQueryString(String) Ihre Parameter & KEINE URL-codieren oder abgrenzen, während setQueryString(NameValuePair[]) automatisch URL-encodieren und Ihre Parameternamen und -werte abgrenzen. Dies ist die beste Methode, wenn Sie dynamische Daten verwenden, weil es Et-Zeichen, Gleichheitszeichen enthalten könnten, usw.

8

es auf diese Weise versuchen:

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()); 
+6

In welchem ​​Paket befindet sich UrlBuilder? –

+0

Ich denke, es sollte sein: "GetMethod (builder.build())" –

+0

URIBuilder finden Sie unter: org.apache.http.client.utils.URIBuilder; – AtliB

Verwandte Themen