Living Vicariously: usar servidores proxy com as bibliotecas de cliente da API Google Data

Jeff Fisher, equipe de APIs de dados do Google
junho de 2007

Introdução: por que usar um proxy?

Um servidor proxy é um computador (ou serviço em um computador) que faz solicitações em nome de vários computadores clientes, geralmente para recursos externos. Este artigo trata de servidores proxy HTTP, já que o HTTP é o protocolo usado para acessar as APIs públicas dos serviços da Web do Google. Por extensão, os proxies HTTPS ou SSL também são interessantes ao fazer solicitações HTTP que contêm informações sensíveis, como dados pessoais ou senhas de usuários. Muitas empresas grandes usam proxies HTTP para controlar quais sites ou informações os funcionários podem acessar na Internet. Bibliotecas públicas e escolas também implementam proxies para essa finalidade. Há também vários servidores proxy disponíveis publicamente que podem ser usados para acessar conteúdo da Web de forma anônima.

Os possíveis problemas ao usar um servidor proxy dependem do software usado e de como ele está configurado. Um proxy é considerado "transparente" se não alterar a solicitação do cliente ou a resposta do servidor de nenhuma forma, exceto o necessário para identificação e autenticação do proxy. No entanto, um grande número de servidores proxy altera a solicitação ou a resposta de maneiras que um desenvolvedor precisa conhecer. Em particular, alguns proxies alteram o tipo de conteúdo da resposta ou removem os cabeçalhos HTTP keep-alive do envio ao servidor externo que hospeda o recurso.

Então, por que um desenvolvedor usaria um proxy HTTP ou SSL? Geralmente, há dois motivos para isso: é exigido por alguma infraestrutura corporativa ou o desenvolvedor quer depurar um aplicativo que usa um serviço da Web. O primeiro motivo é totalmente inevitável se as regras da rede em que o desenvolvedor está trabalhando proibirem conexões da Web ou SSL não proxyadas com sites externos. O segundo motivo é relatado com frequência nos nossos fóruns de suporte por desenvolvedores que tentam resolver problemas ao lidar com um serviço da Web do Google. Existem proxies de "depuração" para fins especiais, como Fiddler e Charles, que são voltados para essa situação específica. Para mais informações sobre esse uso de um servidor proxy, leia o artigo On the Wire: Tools for API Developers (em inglês).

Para alguns aplicativos, pode ser difícil adicionar suporte a servidores proxy. Felizmente, a maioria das bibliotecas de cliente da API Google Data pode funcionar com um servidor proxy HTTP após algumas pequenas modificações no código. Este artigo serve como ponto de partida para um desenvolvedor que quer usar um servidor proxy para as solicitações da Web feitas pelo aplicativo.

Java

Usar um proxy HTTP com a biblioteca de cliente Java é fácil graças ao uso de propriedades do sistema pela Sun para gerenciar as configurações de conexão.

Por exemplo, se o servidor proxy corporativo estivesse sendo executado em "my.proxy.domain.com", na porta 3128, você poderia adicionar o seguinte ao código antes de criar um objeto de serviço para o Google Agenda, o Google Sheets etc.

System.setProperty("http.proxyHost", "my.proxy.domain.com");
System.setProperty("http.proxyPort", "3128");

Como alternativa, isso pode ser feito na linha de comando ao iniciar o ambiente de servlet:

java -Dhttp.proxyHost=my.proxy.domain.com -Dhttp.proxyPort=3128

Com versões mais recentes do pacote JSSE, isso também pode ser estendido para proxies SSL. Se o mesmo servidor proxy do exemplo anterior estivesse executando um proxy SSL na porta 3129, o código necessário seria:

System.setProperty("https.proxyHost", "my.proxy.domain.com");
System.setProperty("https.proxyPort", "3129");

Isso também pode ser feito na linha de comando da mesma forma que com o proxy HTTP.

Às vezes, é necessário fornecer credenciais a um servidor proxy para usá-lo. Normalmente, eles são enviados usando um hash base64 incluído em um cabeçalho HTTP, da seguinte forma:

String encoded = new String(Base64.encodeBase64(new String("username:password").getBytes()));
String base64encodedCredentials = "Basic " + encoded;
myService.getRequestFactory().setPrivateHeader("Proxy-Authorization", base64encodedCredentials);

O código acima usa o pacote Apache Commons Codec para fazer a codificação base64 necessária. Você precisará importar a classe org.apache.commons.codec.binary.Base64 para executar o código acima.

.NET

Usar um proxy HTTP com a biblioteca de cliente .NET não é tão simples quanto com o cliente Java, mas pode ser feito de maneira semelhante ao criar o objeto de serviço para um produto específico.

Por exemplo, podemos usar um proxy para interagir com o serviço do Google Agenda:

using System.Net;

CalendarService service = new CalendarService("CalendarSampleApp");
query.Uri = new Uri(calendarURI);
GDataRequestFactory requestFactory = (GDataRequestFactory) service.RequestFactory;
IWebProxy iProxy = WebRequest.DefaultWebProxy;
WebProxy myProxy = new WebProxy(iProxy.GetProxy(query.Uri));
// potentially, setup credentials on the proxy here
myProxy.Credentials = CredentialCache.DefaultCredentials;
myProxy.UseDefaultCredentials = true;
requestFactory.Proxy = myProxy;

Isso detecta o proxy necessário nas configurações de conexão com a Internet, um recurso interessante da biblioteca .NET. No entanto, se você não confiar nele para descobrir o proxy corretamente, também é possível definir o proxy mudando o código para:

using System.Net;

CalendarService service = new CalendarService("CalendarSampleApp");
GDataRequestFactory requestFactory = (GDataRequestFactory) service.RequestFactory;
WebProxy myProxy = new WebProxy("http://my.proxy.example.com:3128/",true);
// potentially, setup credentials on the proxy here
myProxy.Credentials = CredentialCache.DefaultCredentials;
myProxy.UseDefaultCredentials = true;
requestFactory.Proxy = myProxy;

Conclusão

Neste artigo, discutimos como fazer com que algumas das bibliotecas de cliente da API Google Data funcionem com um servidor proxy HTTP. Os desenvolvedores que trabalham por trás de um servidor proxy exigido pela política de rede ainda podem usar essas bibliotecas. Os desenvolvedores também podem usar um servidor proxy para ajudar a depurar o código. Para isso, o servidor proxy registra o conteúdo das solicitações e respostas HTTP enviadas e recebidas de um serviço da Web do Google. Há casos de uso mais avançados de um servidor proxy e outras bibliotecas de cliente que não são abordados neste tutorial. Os desenvolvedores que precisarem de mais ajuda podem participar dos nossos grupos de suporte públicos vinculados abaixo.

Para mais informações sobre as bibliotecas de cliente usadas neste artigo, acesse as seguintes páginas:

Outros recursos: