Vivre par procuration: utiliser des serveurs proxy avec les bibliothèques clientes de l'API Google Data

Jeff Fisher, équipe Google Data APIs
Juin 2007

Introduction: pourquoi utiliser un proxy ?

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

Les éventuels problèmes rencontrés avec un serveur proxy dépendent du logiciel utilisé et de sa configuration. Un proxy est considéré comme "transparent" s'il ne modifie pas la requête du client ni la réponse du serveur de quelque autre manière que celle nécessaire à l'identification et à l'authentification du proxy. Toutefois, un grand nombre de serveurs proxy modifient la requête ou la réponse de façon à que le développeur en ait connaissance. En particulier, certains proxys modifient le type de contenu de la réponse ou suppriment les en-têtes HTTP keep-alive d'être envoyés au serveur externe hébergeant la ressource.

Pourquoi un développeur voudrait-il utiliser un proxy HTTP ou SSL ? Deux raisons sont généralement à l'origine de ce phénomène: elle est requise par certaines infrastructures d'entreprise ou le développeur souhaite déboguer une application qui utilise un service Web. La première raison est inévitable si les règles du réseau sur lequel le développeur travaille n'autorisent pas les connexions Web ou proxy SSL sans proxy vers des sites Web externes. Ce problème est fréquemment signalé sur nos forums d'assistance par des développeurs qui tentent de résoudre des problèmes liés à un service Web Google. Des proxys de "débogage" spéciaux tels que Fiddler et Charles sont adaptés à cette situation. Pour en savoir plus sur l'utilisation d'un serveur proxy, nous vous invitons à lire notre article On the Wire: Tools for API Developers.

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

Java

L'utilisation des propriétés système de Sun pour gérer les paramètres de connexion est un jeu d'enfant avec un proxy HTTP avec la bibliothèque cliente Java.

Par exemple, si votre serveur proxy d'entreprise s'exécute sur "my.proxy.domain.com", vous pouvez ajouter ce qui suit à votre code avant de créer un objet de service pour Google Agenda, les feuilles de calcul Google, 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 au démarrage de 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 de l'exemple précédent exécute un proxy SSL sur le port 3129, le code nécessaire serait:

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 se peut que vous deviez fournir des identifiants à un serveur proxy pour pouvoir l'utiliser. Elles sont généralement envoyées à 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 nécessaire en base64. Vous devez 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 que celle du client Java, mais elle peut être effectuée de la même manière lors de la création de l'objet de service pour un produit particulier.

Nous pouvons, par exemple, 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;

Celui-ci devrait détecter le proxy nécessaire dans les paramètres de connexion Internet, une fonctionnalité intéressante de la bibliothèque .NET. Cependant, si vous ne lui faites pas confiance pour détecter correctement le proxy, vous pouvez également le modifier 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 de l'API Google Data avec un serveur proxy HTTP. Les développeurs travaillant derrière un serveur proxy imposé par une règle de réseau peuvent toujours utiliser ces bibliothèques. Les développeurs peuvent également utiliser un serveur proxy pour faciliter le débogage de leur code, en leur faisant enregistrer le contenu des requêtes HTTP et les réponses envoyées vers et depuis un service Web Google. Il existe des cas d'utilisation plus avancés d'un serveur proxy et d'autres bibliothèques clientes qui ne sont pas traitées dans ce tutoriel. Les développeurs ayant besoin d'aide supplémentaire sont encouragés à rejoindre 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: