Vivre par procuration : utiliser des serveurs proxy avec les bibliothèques clientes des Google Data APIs

Jeff Fisher, équipe des API Google Data
Juin 2007

Introduction : pourquoi utiliser un proxy ?

Un serveur proxy est un ordinateur (ou un service sur un ordinateur) qui envoie des requêtes pour le compte de plusieurs ordinateurs clients, généralement à des ressources externes. Cet article traite des serveurs proxy HTTP, car HTTP est le protocole utilisé pour accéder aux API publiques des services Web de Google. Par extension, les proxys HTTPS ou SSL sont également intéressants pour les requêtes HTTP contenant des informations sensibles telles que des données utilisateur privées ou des mots de passe. De nombreuses grandes entreprises utilisent aujourd'hui des proxys HTTP pour contrôler les sites Web ou les informations que les employés peuvent consulter sur Internet. Les bibliothèques publiques et les écoles sont également connues pour implémenter des proxys à cette fin. Il existe également un certain nombre de serveurs proxy accessibles au public qui peuvent être utilisés pour accéder anonymement au contenu Web.

Les problèmes potentiels rencontrés lors de l'utilisation d'un serveur proxy dépendent du logiciel utilisé et de sa configuration. Un proxy est considéré comme "transparent" s'il ne modifie en aucun cas la requête du client ni la réponse du serveur, sauf si cela est nécessaire pour l'identification et l'authentification du proxy. Toutefois, un grand nombre de serveurs proxy modifient la requête ou la réponse d'une manière dont le développeur doit être conscient. En particulier, certains proxys modifient le type de contenu de la réponse ou suppriment les en-têtes HTTP keep-alive qui sont envoyés au serveur externe hébergeant la ressource.

Alors, pourquoi un développeur voudrait-il utiliser un proxy HTTP ou SSL ? Il y a généralement deux raisons à cela : soit c'est requis par une infrastructure d'entreprise, soit le développeur souhaite déboguer une application qui utilise un service Web. La première raison est tout à fait inévitable si les règles du réseau sur lequel le développeur travaille interdisent les connexions Web ou SSL non proxyfiées à des sites Web externes. Cette dernière raison est fréquemment signalée sur nos forums d'assistance par les développeurs qui tentent de résoudre des problèmes lorsqu'ils utilisent un service Web Google. Il existe des proxys de "débogage" à usage spécifique, tels que Fiddler et Charles, qui sont conçus pour ce type de situation. Pour en savoir plus sur l'utilisation d'un serveur proxy, consultez notre article On the Wire: Tools for API Developers.

Pour certaines applications, il peut être difficile d'ajouter la prise en charge du serveur proxy. Heureusement, la plupart des bibliothèques clientes pour l'API Google Data peuvent fonctionner avec un serveur proxy HTTP après quelques modifications mineures du code. Cet article sert de point de départ pour un développeur qui souhaite utiliser un serveur proxy pour les requêtes Web effectuées par son application.

Java

Il est facile d'utiliser un proxy HTTP avec la bibliothèque cliente Java grâce à l'utilisation de propriétés système par Sun pour gérer les paramètres de connexion.

Par exemple, si votre serveur proxy d'entreprise s'exécute sur "my.proxy.domain.com", sur le port 3128, vous pouvez ajouter les éléments suivants à votre code avant de créer un objet de service pour Google Agenda, Google Sheets, etc.

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

Vous pouvez également effectuer cette opération sur la ligne de commande lorsque vous démarrez votre environnement de servlet :

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

Avec les versions plus récentes du package JSSE, cela peut également être étendu aux proxys SSL. Si le même serveur proxy que dans l'exemple précédent exécutait un proxy SSL sur le port 3129, le code nécessaire serait le suivant :

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

Vous pouvez également le faire à partir de la ligne de commande de la même manière qu'avec le proxy HTTP.

Il peut arriver que vous deviez fournir des identifiants à un serveur proxy pour pouvoir l'utiliser. En général, ils sont envoyés à l'aide d'un hachage base64 inclus dans un en-tête HTTP, comme suit :

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

Notez que le code ci-dessus utilise le package Apache Commons Codec pour effectuer l'encodage base64 nécessaire. Vous devrez importer la classe org.apache.commons.codec.binary.Base64 pour exécuter le code ci-dessus.

.NET

L'utilisation d'un proxy HTTP avec la bibliothèque cliente .NET n'est pas aussi simple qu'avec le client Java, mais elle peut être effectuée de manière similaire lors de la création de l'objet de service pour un produit spécifique.

Par exemple, nous pouvons utiliser un proxy pour interagir avec le service 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;

Le proxy nécessaire devrait être détecté à partir des paramètres de votre connexion Internet. Il s'agit d'une fonctionnalité intéressante de la bibliothèque .NET. Toutefois, si vous ne lui faites pas confiance pour découvrir correctement le proxy, vous pouvez également le définir en modifiant le code comme suit :

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;

Conclusion

Cet article explique comment faire fonctionner certaines bibliothèques clientes des Google Data APIs avec un serveur proxy HTTP. Les développeurs travaillant derrière un serveur proxy imposé par une règle réseau peuvent toujours utiliser ces bibliothèques. Les développeurs peuvent également utiliser un serveur proxy pour déboguer leur code en demandant au serveur proxy d'enregistrer le contenu des requêtes et des réponses HTTP envoyées à un service Web Google et reçues de celui-ci. Il existe des cas d'utilisation plus avancés d'un serveur proxy et d'autres bibliothèques clientes qui ne sont pas abordés dans ce tutoriel. Les développeurs qui ont besoin d'aide supplémentaire sont invités à participer à nos groupes d'assistance publics dont les liens sont fournis ci-dessous.

Pour en savoir plus sur les bibliothèques clientes utilisées dans cet article, consultez les pages suivantes :

Autres ressources :