Como faço para adicionar parâmetros de consulta a um GetMethod (usando commons-httpclient Java)?
-
03-07-2019 - |
Pergunta
Usando do Apache commons-httpclient para Java, qual é a melhor maneira de adicionar parâmetros de consulta a uma instância GetMethod? Se eu estou usando PostMethod, é muito simples:
PostMethod method = new PostMethod();
method.addParameter("key", "value");
GetMethod não tem um método "addParameter", no entanto. Eu descobri que isso funciona:
GetMethod method = new GetMethod("http://www.example.com/page");
method.setQueryString(new NameValuePair[] {
new NameValuePair("key", "value")
});
No entanto, a maioria dos exemplos que eu vi qualquer codificar os parâmetros diretamente na URL, por exemplo:.
GetMethod method = new GetMethod("http://www.example.com/page?key=value");
ou codificar a string de consulta, por exemplo:.
GetMethod method = new GetMethod("http://www.example.com/page");
method.setQueryString("?key=value");
é um desses padrões para ser preferido? E por que a discrepância entre API PostMethod e GetMethod? E o que são todos aqueles outros HttpMethodParams métodos destinados a ser utilizados para?
Solução
Métodos Pós ter parâmetros post, mas get métodos não .
Os parâmetros de consulta são incorporadas no URL. A versão atual do HttpClient aceita uma string no construtor. Se você quiser adicionar a chave, valor par acima, você poderia usar:
String url = "http://www.example.com/page?key=value";
GetMethod method = new GetMethod(url);
Um bom tutorial de partida pode ser encontrado na página Apache Jakarta Commons .
Atualizar :. Como sugerido no comentário, NameValuePair funciona
GetMethod method = new GetMethod("example.com/page");
method.setQueryString(new NameValuePair[] {
new NameValuePair("key", "value")
});
Outras dicas
Não é apenas uma questão de preferência pessoal. A questão pertinente aqui é URL-codificar os seus valores de parâmetros, de modo que os valores não vai ficar corrompido ou mal interpretado como delimitadores extras, etc.
Como sempre, é melhor ler a documentação da API em detalhes: HttpClient API Documentação
Lendo isso, você pode ver que setQueryString(String)
vai NÃO URL-codificar ou delimitar os parâmetros e valores, enquanto setQueryString(NameValuePair[])
automaticamente URL-codificar e delimitar seus nomes e valores de parâmetros. Este é o melhor método sempre que você estiver usando dados dinâmicos, porque pode conter ampersands, sinais de igual etc.
Tente desta forma:
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());