Vivir de manera alegre: usa servidores proxy con las bibliotecas cliente de la API de datos de Google

Jeff Fisher, equipo de API de datos de Google
Junio de 2007

Introducción: ¿Por qué elegir un proxy?

Un servidor proxy es una computadora (o servicio en una computadora) que realiza solicitudes para una serie de computadoras cliente en su nombre, normalmente a recursos externos. En este artículo, se tratan los servidores proxy HTTP, ya que HTTP es el protocolo que se usa para acceder a las API públicas de los servicios web de Google. Por extensión, los proxies HTTPS o SSL también son de interés cuando se realizan solicitudes HTTP que contienen información sensible, como contraseñas o datos privados del usuario. En la actualidad, muchas empresas grandes usan proxies HTTP para controlar qué sitios web o qué información pueden ver los empleados en Internet. También se sabe que las bibliotecas públicas y las escuelas implementan proxies para este propósito. También hay varios servidores proxy disponibles públicamente que se pueden utilizar para acceder de forma anónima al contenido web.

Los posibles problemas que se enfrentan al usar un servidor proxy dependen del software que se utilice y de su configuración. Un proxy se considera "transparente" si no modifica la solicitud del cliente ni la respuesta del servidor de ninguna manera que sea necesaria para la identificación y autenticación de proxy. Sin embargo, una gran cantidad de servidores proxy alteran la solicitud o la respuesta de formas que un desarrollador debe conocer. En particular, ciertos proxies alterarán el tipo de contenido de la respuesta o quitarán los encabezados keep-alive de HTTP para que no se envíen al servidor externo que aloja el recurso.

Entonces, ¿por qué un desarrollador querría usar un proxy HTTP o SSL? En general, esto se debe a dos motivos: una infraestructura corporativa o el desarrollador desea depurar una aplicación que usa un servicio web. La primera razón es inevitable si las reglas para la red en la que está trabajando el desarrollador prohíben las conexiones web o de SSL sin proxy a sitios web externos. Este último motivo se informa con frecuencia en nuestros foros de asistencia cuando los desarrolladores intentan solucionar problemas cuando trabajan con un servicio web de Google. Hay proxies de “depuración” de propósito especial, como Fiddler y Charles, que están diseñados para esta situación. Si deseas obtener más información sobre el uso de un servidor proxy, te recomendamos leer nuestro artículo On the Wire: Tools for API Developers.

Para algunas aplicaciones, puede ser difícil agregar compatibilidad con el servidor proxy. Afortunadamente, la mayoría de las bibliotecas cliente para la API de datos de Google pueden funcionar con un servidor proxy HTTP después de algunas pequeñas modificaciones del código. Este artículo está diseñado como punto de partida para un desarrollador que desea usar un servidor proxy para las solicitudes web que realiza su aplicación.

Java

Usar un proxy HTTP con la biblioteca cliente de Java es fácil gracias al uso de propiedades del sistema por parte de Sun para administrar la configuración de la conexión.

Por ejemplo, si su servidor proxy corporativo se ejecuta en "my.proxy.domain.com", en el puerto 3128, puede agregar lo siguiente a su código antes de crear un objeto de servicio para Calendario de Google, Hojas de cálculo de Google, etc.

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

Como alternativa, esto se puede hacer en la línea de comandos cuando se inicia el entorno de servlet:

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

Con las versiones más recientes del paquete JSSE, esto también se puede extender a los proxies SSL. Si el mismo servidor proxy del ejemplo anterior ejecutara un proxy SSL en el puerto 3129, el código necesario sería el siguiente:

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

Esto también se puede hacer desde la línea de comandos de la misma manera que con el proxy HTTP.

A veces, es posible que debas proporcionar credenciales a un servidor proxy para poder usarlo. Por lo general, se envían mediante un hash base64 incluido en un encabezado HTTP, de la siguiente manera:

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

Ten en cuenta que el código anterior usa el paquete Códec de Apache Commons para realizar la codificación base64 necesaria. Para ejecutar el código anterior, deberás importar la clase org.apache.commons.codec.binary.Base64.

.NET

El uso de un proxy HTTP con la biblioteca cliente .NET no es tan trivial como el del cliente Java, pero se puede lograr de una manera similar cuando se crea el objeto de servicio para un producto en particular.

Por ejemplo, es posible que quieras usar un proxy para interactuar con el servicio de Calendario de Google:

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;

Esto debería detectar el proxy necesario en tu configuración de conexión a Internet, una buena característica de la biblioteca .NET. Sin embargo, si no confías en el proxy de manera correcta, también puedes configurarlo si cambias el código por:

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;

Conclusión

En este artículo, se explica cómo hacer que algunas de las bibliotecas cliente de la API de datos de Google funcionen con un servidor proxy HTTP. Los desarrolladores que trabajan detrás de un servidor proxy que exige la política de red aún pueden usar estas bibliotecas. Los desarrolladores también pueden emplear un servidor proxy para depurar su código haciendo que el servidor proxy registre el contenido de las solicitudes y respuestas HTTP que se envían desde y hacia un servicio web de Google. Hay casos de uso más avanzados de un servidor proxy y otras bibliotecas cliente que no se incluyen en este instructivo. Se recomienda a los desarrolladores que necesiten ayuda adicional participar en nuestros grupos públicos de asistencia que se incluyen en los vínculos a continuación.

Para obtener información adicional sobre las bibliotecas cliente usadas en este artículo, visita las siguientes páginas:

Otros recursos: