Attention: cette page se réfère à une ancienne version de SFML. Cliquez ici pour passer à la dernière version.

Utiliser HTTP

Introduction

HTTP (HyperText Transfer Protocol) est le protocole utilisé pour transférer des fichiers sur internet : pages web, images, etc. Il consiste en une architecture client-serveur où le client envoie des requêtes, et le serveur renvoie des réponses contenant les ressources demandées par le client.

SFML fournit une class qui implémente un client HTTP : sf::Http.

Requêtes

Une requête HTTP dans SFML est représentée par la classe sf::Http::Request. Celle-ci contient cinq membres :

Chacun de ces cinq membres peut être modifié via les accesseurs de la classe sf::Http::Request:

sf::Http::Request Request;
Request.SetMethod(sf::Http::Request::Get);
Request.SetURI("/");
Request.SetBody("");
Request.SetHttpVersion(1, 0);
Request.SetField("From", "my_email@gmail.com");

Notez que tous ces membres ont une valeur par défaut correcte; SFML s'assure que vos requêtes sont toujours bien valides quoique vous fassiez, ainsi vous pouvez vous concentrer sur les paramètres importants (comme l'URI à récupérer) et laisser de côté les détails ennuyeux du protocole HTTP.
Cette requête pourrait donc être simplifiée au morceau de code suivant :

sf::Http::Request Request;
Request.SetURI("/");

Réponses

Après avoir envoyé une requête (ce que nous verrons dans le chapitre suivant), vous recevez une réponse du serveur. Cette réponse est représentée par la classe sf::Http::Response.

Une réponse consiste en quatre membres :

Tous ces membres peuvent être lus via les accesseurs de la classe sf::Http::Response :

sf::Http::Response Response;
...
sf::Http::Response::Status Status = Response.GetStatus();
unsigned int Major = Response.GetMajorHttpVersion();
unsigned int Minor = Response.GetMinorHttpVersion();
std::string Body = Response.GetBody();
std::string Type = Response.GetField("Content-Type");

Les codes d'état sont décrits dans l'énumeration sf::Http::Response::Status. Il existe plusieurs codes de succès, mais le principal est sf::Http::Response::Ok.

Assembler tout ça

Maintenant que vous savez écrire des requêtes et lire des réponses, il ne vous manque que deux choses : se connecter à un serveur HTTP, et envoyer les requêtes.

La connection à un serveur est effectuée via la fonction SetHost :

sf::Http Http;
Http.SetHost("www.whatismyip.org");

En fait, cette fonction ne fait rien d'autre que mémoriser le nom de l'hôte, la connexion ne s'effectue réellement qu'avant requête, puis est refermée juste après avoir reçu la réponse. C'est pourquoi cette fonction est nommée SetHost plutôt que Connect.

Cette fonction peut accepter un paramètre additionnel : le port réseau à utiliser pour la connexion. Si vous ne le spécifiez pas explicitement, SFML utilisera simplement le port par défaut associé au protocole utilisé : 80 pour HTTP, 443 pour HTTPS.

Une fois le serveur défini, vous pouvez envoyer des requêtes avec la fonction SendRequest :

sf::Http::Response Response = Http.SendRequest(Request);

Cette fonction prend en paramètre un sf::Http::Request, et retourne une instance de sf::Http::Response.

C'est tout pour ce qui est de l'interface de la classe sf::Http, seulement deux fonctions ! Il n'y a même pas besoin de se déconnecter du serveur, étant donné que c'est fait automatiquement après chaque appel à SendRequest.

Conclusion

La classe sf::Http est un outil puissant pour manipuler le protocole HTTP, et accéder à des pages web ou à des fichiers via internet.
Jetons maintenant un oeil à son frère, le protocole FTP.