Как добавить параметры запроса в GetMethod (используя Java commons-httpclient)? - PullRequest
32 голосов
/ 20 октября 2008

Как использовать Apache commons-httpclient для 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");

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

Ответы [ 3 ]

22 голосов
/ 20 октября 2008

Методы публикации имеют параметры публикации, но методы получения не .

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

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

Хорошее начальное руководство можно найти на странице Apache Jakarta Commons .

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

GetMethod method = new GetMethod("example.com/page"); 
method.setQueryString(new NameValuePair[] { 
    new NameValuePair("key", "value") 
}); 
17 голосов
/ 09 августа 2010

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

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

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

8 голосов
/ 23 октября 2012

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

    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());
...