2008-10-19 8 views
32

Utilizzo di Apache's common-httpclient per Java, qual è il modo migliore per aggiungere parametri di query a un'istanza GetMethod? Se sto usando PostMethod, è molto semplice:Come aggiungere parametri di query a GetMethod (utilizzando Java commons-httpclient)?

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

GetMethod non dispone di un metodo di "addParameter", però. Ho scoperto che questo funziona:

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

Tuttavia, la maggior parte degli esempi che ho visto o hard-code i parametri direttamente nella URL, ad esempio:

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

o hard-code il stringa di query, ad esempio:

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

Uno di questi modelli è preferibile? E perché la discrepanza API tra PostMethod e GetMethod? E quali sono tutti gli altri metodi HttpMethodParams per i quali è stato concepito?

risposta

22

I metodi Post hanno parametri di post, ma get methods do not.

I parametri di query sono incorporati nell'URL. La versione corrente di HttpClient accetta una stringa nel costruttore. Se si voleva aggiungere la coppia di chiavi, valore superiore, è possibile utilizzare:

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

Un buon tutorial di partenza può essere trovato sul Apache Jakarta Commons page.

Aggiornamento: Come suggerito nel commento, NameValuePair funziona.

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

ho scoperto che questo funziona: metodo GetMethod = new GetMethod ("http://www.example.com/page"); method.setQueryString (new NameValuePair [] { new NameValuePair ("chiave", "valore") }); Tuttavia, questo non è menzionato nella pagina del tutorial. Questo modello dovrebbe essere evitato? – Ross

+0

Hm, apparentemente non puoi inserire blocchi di codice nei commenti, quindi ho modificato la mia domanda per aggiungere quell'esempio e altri. – Ross

17

Non è solo una questione di preferenze personali. La questione pertinente qui è URL-codifica dei valori dei parametri, in modo che i valori non avranno danneggiato o mal interpretato come delimitatori aggiuntivi, ecc

Come sempre, è meglio leggere la documentazione API in dettaglio: HttpClient API Documentation

Leggendo questo, è possibile vedere che setQueryString(String) NON codifica URL o delimita i parametri & valori, mentre setQueryString(NameValuePair[]) automaticamente codificherà URL e delimiterà i nomi e i valori dei parametri. Questo è il metodo migliore quando si utilizzano dati dinamici, perché potrebbe contenere e commerciali, segni di uguale ecc

8

Prova in questo modo:

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 quale pacchetto si trova UrlBuilder? –

+0

Penso che dovrebbe essere: "GetMethod (builder.build())" –

+0

URIBuilder può essere trovato su: org.apache.http.client.utils.URIBuilder; – AtliB

Problemi correlati