Criando requisições HTTP através de proxies com o Commons HttpClient

Atenção, este blog foi migrado para: http://brunopereira.org

Hoje eu tive que criar algumas requisições HTTP através de um proxy, numa integração que estou implementando. Minha aplicação precisa enviar solicitações HTTP a um servidor remoto, passando por um proxy, e eu uso o Commons HttpClient para montar estas requisições.

Como achei a documentação disso bem fraquinha no site do projeto, resolvi postar aqui um exemplo de código para facilitar quem possa precisar (e a mim mesmo no futuro). Este exemplo é um método de teste junit bem simples que monta uma requisição RESTful de cadastro de um novo usuário, especificando as configurações do proxy na API. Utilizei o XStream para fazer as manipulações XML. Segue o exemplo:

public void testCriacao() throws HttpException, IOException{
Usuario novoUsuario = new Usuario();
novoUsuario.setLogin("fulano");
novoUsuario.setSenha("123456");
novoUsuario.setNome("Fulano");
novoUsuario.setSobrenome("da Silva");
novoUsuario.setStatusConta(1);
novoUsuario.setTamanhoMailBox(6144);


HttpClient client = new HttpClient();
//servidor remoto que iremos acessar
HostConfiguration hostConfiguration = new HostConfiguration();
hostConfiguration.setHost("www.domain.com", 8080);
// proxy pelo qual precisamos passar
ProxyHost proxy = new ProxyHost("10.10.10.10", 9090);
hostConfiguration.setProxyHost(proxy);
client.setHostConfiguration(hostConfiguration);


PostMethod method = new PostMethod("http://www.domain.com:8080/MailIntegration/usuario/");
XStream xstream = new XStream();
xstream.alias("usuario", Usuario.class);
String usuarioXml = xstream.toXML(novoUsuario);
StringRequestEntity requestEntity = new StringRequestEntity(usuarioXml, "text/xml", "UTF-8");
method.setRequestEntity(requestEntity);
int statusCode = client.executeMethod(method);
assertEquals(201, statusCode);
Usuario usuarioCadastrado = (Usuario)xstream.fromXML(method.getResponseBodyAsStream());

2 respostas para Criando requisições HTTP através de proxies com o Commons HttpClient

  1. Gustavo disse:

    setando as propriedades de sistema no start da jvm -Dhttps.proxyHost=proxy01.com -Dhttps.proxyPort=3128 -Dhttp.proxyHost=proxy01.com -Dhttp.proxyPort=3128 nao resolveria? participei de um projeto que as requisicoes http precisavam passar por um proxy e configurei esses parametros no startup da vm e funcionou perfeitamente… e o desenvolvedor nao precisou alterar o código dele.🙂

  2. blpsilva disse:

    Oi Gustavo, sua abordagem certamente é válida também. A escolha entre as 2 opções dependeria da situação.

    Usando parâmetros da JVM, vc indica um proxy para uso pela aplicação como um todo.

    Da forma que eu falei, você consegue ter proxies diferentes sendo usados na sua aplicação. Vamos supôr que a aplicação precisa acessar 2 web services de empresas distintas. Vamos pensar por exemplo um dos web services sendo de uma aplicação interna da mesma empresa (ex: Sistema de Billing) e o outro web service sendo de uma empresa fornecedora de e-mail. Com a JVM você ficaria limitado a um proxy. Além disso, essa forma através da API facilita que o host e porta do proxy sejam configuráveis dinamicamente, caso necessário.

    Como na maioria dos casos existirá apenas um proxy e este proxy mudará raramente, ambas as abordagens atenderiam adequadamente. Em casos em que os requisitos sejam um pouco mais sofisticados, vale a pena avaliar qual das 2 é mais adequada. Just my 2 cents😉

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: