Table des matières

, ,

Notes et transcriptions du cours “Démarrer avec Go” proposée par University of California, Irvine disponible sur la plateforme coursera.

RFCs

RFC signifie Request For Comments. C'est un document technique qui définit un protocole ou un format, une définition de standard.

La raison pour laquelle cela nous préoccupe n'est pas directement lié à un objectif, mais chaque fois que vous écrivez un programme, vous devez traiter des données, vous voudrez interagir avec d'autres systèmes, d' autres ensembles de données d'une manière ou d'une autre.

C'est extrêmement fréquent. Par exemple, vous souhaiterez peut-être que votre programme lise des fichiers provenant du web, s'interface avec des bases de données MySQL et traite les informations.

Il doit donc y avoir un format sur lequel tout le monde est d'accord, via lequel vous pouvez communiquer et votre code pourra traiter ce format.

Il en va de même pour les protocoles réseau. Vous souhaiterez peut-être développer une application client-serveur comme un client Web. Votre client Web doit communiquer avec un serveur via le réseau. Pour échanger avec un serveur, il doit envoyer des messages conformes à un protocole particulier. Le serveur comprend donc ce qu'il reçoit. Ensuite, à l'autre bout côté client, votre programme doit être capable de comprendre le format, le protocole du message qu'il à reçu en retour.

Ainsi, chaque fois que vous créez une application et qu'elle doit interagir avec d'autres systèmes, via des transferts de données, ces données doivent être mises en forme de manière à ce que tout le monde les comprenne.

Une grande partie de ces formats et de ces protocoles sont bien définis, normalisés et utilisés pour la communication et échanges de données entre différents systèmes. Ils sont nombreux et des RFC ont été écrites pour ces protocoles et la plupart de ces normes.

Exemple de protocoles

Prenons l'exemple du HTML pour HyperText Markup Language , le langage de balisage hypertexte. Le HTML est le langage dans lequel les pages Web sont écrites. C'est un langage standardisé et décrit par la RFC 1866. Tous les clients, tous les navigateurs Web doivent comprendre ce langage afin de savoir comment le mettre en forme à l'écran, etc.

C'est donc via l'un de ces langages normalisés que vous pouvez échanger des données entre un client Web et un serveur Web, en utilisant cette norme.

Pour les URI, il y a aussi la RFC 3986. URI signifie Unified Ressource Locator. C'est essentiellement la méthode d'adressage utilisée sur le Web : Vous connaissez l'URL, c'est un type d'URI. Il existe donc un format particulier qui doit être respecté afin que chaque client, chaque serveur puisse interpréter correctement l'adresse.

HTTP pour HyperText Transfert Protocole dédié aux échanges de données pour le Web. C'est la RFC 2616 qui décrit comment les messages doivent être transférés sur le réseau : quelles informations doivent être incluses dans chaque message et quels sont les en-têtes ; Où devraient se trouver les données, le contenu, etc. Tout cela est défini pour qu'un client Web puisse échanger avec un serveur Web.

Ce ne sont donc que quelques-uns des standards définis par les RFC. Ils sont très nombreux et certains d'entre eux peuvent être complexes.

Packages de protocoles

Le langage Go fournit des packages qui vous aident à traiter un bon nombre de ces formats. Il existe des packages pour la plupart des RFC importants, il existe des packages déjà créés que vous pouvez importer dans vos programmes. Ces packages fournissent un ensemble de fonctions que vous utilisez pour encoder/décoder les données dans le format du protocole.

Si vous recevez des données dans un format particulier, vous devez décoder ces informations et les traduire en types traités par Go : structs, maps ou tout objet du Golang. Et inversement il faudra convertir les objets Go dans le format adapté au protocole pour transmettre les données.

A titre d'exemple, il y a un package “net/http” qui fournit un tas de fonctions qui vous permettent de créer des messages et de les envoyer.

http.Get(www.uci.edu)

Dans l'exemple ci-dessus on utilise http.Get() qui produira un message “HTTP GET” lorsque vous passez en argument un domaine Web. Elle fera une demande de page Web à ce domaine et elle vous renverra le contenu de la page Web. Il existe donc un ensemble de fonctions comme celle-ci définies dans ce package qui vous permettent de communiquer sur le Web. Si vous souhaitez créer un client ou un serveur Web ce package vous sera très utile.

Un autre package plus bas niveau est le package “net”, destiné à la programmation TCP/IP et aux sockets. On n'entrera pas dans les détails mais le protocole TCP/IP définit essentiellement Internet. Internet vous permet de communiquer sur le Web, mais vous pouvez utiliser tout autre protocole de communication : FTP, Secure Shell etc.

Ils ont tous en commun de s'appuyer sur la pile TCP/IP et UDP/IP. Le package “net” vous fournit un ensemble de fonctions qui vous permettent d'utiliser ces protocoles.

net.Dial("tcp", "uci.edu:80")

Dans l'exemple ci-dessus on établit une connexion TCP avec la machine distante “uci.edu” sur le port 80 (le port Web) mais il existe beaucoup de ces packages qui sont utilisés pour prendre en charge différents protocoles et formats de données fréquemment utilisés par différents systèmes.

C'est très utile d'avoir ces packages prêt à l'emploi. Sans eux, vous devriez comprendre dans le détail et prendre en charge ces protocoles. Par exemple, prenez le protocole HTTP. Si je n'avais pas le package “net/http”, je devrais tout appréhender du protocole HTTP et créer moi-même les packages. Je devrais définir le formatage des messages HTTP moi-même et pour cela, je devrais écrire mon propre code. Ce n'est pas impossible, mais cela prend du temps.

Pourquoi faire cela lorsque vous pouvez appeler http.Get()? Cela vous facilite beaucoup la tâche en tant que programmeur.

Le format JSON

JSON n'est pas un protocole : c'est un format de données. Un format de données très utilisé dans le monde entier et nous allons parler de cela et du package qui y est associé.

JSON est donc l'abréviation de JavaScript Object Notation. Nous ne programmons pas en JavaScript mais JSON s'étend bien au delà du JavaScript. Aujourd'hui, le JSON est largement accepté comme un moyen courant de représenter et d'échanger des données structurées.

C'est la RFC 759 qui définit un format pour représenter des données structurées ou non, par un ensemble de paires valeur-attribut. C'est assez naturellement proche des structures (structs) ou des tableaux associatifs (maps).

Si vous vous souvenez des structures, elles ont des champs et des valeurs : ainsi, une paire de champ-valeur peut être une paire de valeur-attribut en JSON.

La map (tableau associatif) possède des paires clé-valeur qui peuvent facilement être traduites en paire attribut-valeur de JSON.

Ainsi, ces paires attributs-valeurs des objets Go peuvent trouver des correspondances naturelles en JSON.

Les attributs et les valeurs en JSON, intègrent les types de base. On retrouvera ainsi, les booléens, les entiers, les chaînes de caractères, les tableaux etc et ils peuvent être combinés hiérarchiquement.

Illustrons cela par quelques exemples.

//initialisation d'une structure Go
p1 := Person(name: "Joe",
        addr: "Rue des Tilleuls",
        phone: "+336 78 21 45 73")

Commençons avec une structure Go : le type Person que nous avons définit auparavant. Nous définissons p1et souhaitons transférer ces informations sur une autre machine. Pour le moment, nous l'avons représenté sous forme de structure dans Go.

Nous voulons le traduire en JSON pour que quelqu'un d'autre, un autre programme, un autre système n'importe où puisse interpréter correctement l'information.

Ce que nous voyons ci-dessous est l'objet JSON équivalent.

{"name":"Joe","addr":"Rue des Tilleuls","phone":"+336 78 21 45 73"}

Notez que cela ressemble beaucoup à la structure Go, un struct ou un map. Nous pouvons à présent prendre cet objet JSON et le transmettre à une autre machine, à un autre processus et s'ils peuvent interpréter le JSON, ils pourront extraire toutes les informations que nous utilisions dans notre programme à propos de cette personne.

Il s'agit bien sûr d'une seule personne, mais je on peut avoir une base de données pleine d'objets de type Person. Je pourrais simplement faire passer un ensemble d'objets JSON à quelqu'un et il pourrait lire cet ensemble. Il ne s'agit que d'un simple exemple de JSON. Retenons JSON est lisible pour le programmeur et que c'est un format très répandu et largement supporté.

◁ Précédent | ⌂ Retour au sommaire | Suivant ▷