2008-10-19 4 views
32

Использование Apache для commons-httpclient для Java, каков наилучший способ добавить параметры запроса к экземпляру GetMethod? Если я использую PostMethod, это очень просто:Как добавить параметры запроса в GetMethod (используя Java commons-httpclient)?

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"); 

Является ли один из этих образцов предпочтительным? И почему API-расхождение между PostMethod и GetMethod? И на что все эти другие методы HttpMethodParams предназначены для использования?

ответ

22

Способы сообщения имеют параметры сообщения, но get methods do not.

Параметры запроса встроены в URL-адрес. Текущая версия HttpClient принимает строку в конструкторе. Если вы хотите добавить пару ключ, значение выше, вы можете использовать:

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

Хорошее начало учебник можно найти на Apache Jakarta Commons page.

Обновление: Как указано в комментарии, NameValuePair работает.

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

я обнаружил, что это работает: метод GetMethod = новый GetMethod ("http://www.example.com/page"); method.setQueryString (новое имяValuePair [] { новое имяValuePair ("ключ", "значение") }); Это не упоминается на странице руководства. Следует ли избегать этой картины? – Ross

+0

Хм, видимо, вы не можете помещать блоки кода в комментарии, поэтому я отредактировал свой вопрос, чтобы добавить этот пример и другие. – Ross

17

Это не только вопрос личных предпочтений. Соответствующий вопрос здесь URL-процесс кодирования значений параметров, так что значения не будут повреждены или неправильно истолкованы как дополнительные разделители и т.д.

Как всегда, лучше всего читать документацию API подробно: HttpClient API Documentation

Считая это, вы можете видеть, что setQueryString(String) НЕ будет URL-кодировать или разграничить ваши параметры & значений, тогда как setQueryString(NameValuePair[]) автоматически URL-кодирует и ограничивает имена и значения параметров. Это самый лучший способ, когда вы используете динамические данные, поскольку он может содержать амперсанд, знак равенства и т.д.

8

Попробуй так:

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

какой пакет UrlBuilder? –

+0

Я думаю, что это должно быть: «GetMethod (builder.build())» –

+0

URIBuilder можно найти по адресу: org.apache.http.client.utils.URIBuilder; – AtliB