Go Resty est une bibliothèque de langue Go pour la construction de clients d'API RESTful. Avec Go Resty, les développeurs peuvent construire des clients d'API RESTful fiables plus rapidement et efficacement. Ce chapitre présente comment démarrer rapidement avec Go Resty.
Installation
require github.com/go-resty/resty/v2 v2.7.0
ou
go get github.com/go-resty/resty/v2
Exemple Resty
Les exemples suivants vous aideront à utiliser la bibliothèque resty aussi confortablement que possible.
// Importez resty dans votre code et référez-vous à lui comme `resty`.
import "github.com/go-resty/resty/v2"
Requête GET simple
// Créer un client Resty
client := resty.New()
resp, err := client.R().
EnableTrace().
Get("https://httpbin.org/get")
// Explorer l'objet de réponse
fmt.Println("Informations sur la réponse :")
fmt.Println(" Erreur :", err)
fmt.Println(" Code d'état:", resp.StatusCode())
fmt.Println(" Statut :", resp.Status())
fmt.Println(" Protocole :", resp.Proto())
fmt.Println(" Temps :", resp.Time())
fmt.Println(" Reçu à :", resp.ReceivedAt())
fmt.Println(" Corps :\n", resp)
fmt.Println()
// Explorer les informations de suivi
fmt.Println("Informations de suivi de la requête :")
ti := resp.Request.TraceInfo()
fmt.Println(" Recherche DNS :", ti.DNSLookup)
fmt.Println(" Temps de connexion :", ti.ConnTime)
fmt.Println(" Temps de connexion TCP:", ti.TCPConnTime)
fmt.Println(" Poignée de main TLS :", ti.TLSHandshake)
fmt.Println(" Temps du serveur :", ti.ServerTime)
fmt.Println(" Temps de réponse :", ti.ResponseTime)
fmt.Println(" Temps total :", ti.TotalTime)
fmt.Println(" Connexion réutilisée :", ti.IsConnReused)
fmt.Println(" Connexion était inactif :", ti.IsConnWasIdle)
fmt.Println(" Temps d'inactivité de la connexion :", ti.ConnIdleTime)
fmt.Println(" Tentative de requête :", ti.RequestAttempt)
fmt.Println(" Adresse distante :", ti.RemoteAddr.String())
Résultat
Informations sur la réponse :
Erreur :
Code d'état: 200
Statut : 200 OK
Protocole : HTTP/2.0
Temps : 457.034718ms
Reçu à : 2020-09-14 15:35:29.784681 -0700 PDT m=+0.458137045
Corps :
{
"args": {},
"headers": {
"Accept-Encoding": "gzip",
"Host": "httpbin.org",
"User-Agent": "go-resty/2.4.0 (https://github.com/go-resty/resty)",
"X-Amzn-Trace-Id": "Root=1-5f5ff031-000ff6292204aa6898e4de49"
},
"origin": "0.0.0.0",
"url": "https://httpbin.org/get"
}
Informations de suivi de la requête :
Recherche DNS : 4.074657ms
Temps de connexion : 381.709936ms
Temps de connexion TCP: 77.428048ms
Poignée de main TLS : 299.623597ms
Temps du serveur : 75.414703ms
Temps de réponse : 79.337µs
Temps total : 457.034718ms
Connexion réutilisée : false
Connexion était inactif : false
Temps d'inactivité de la connexion : 0s
Tentative de requête : 1
Adresse distante : 3.221.81.55:443
Demande GET complexe
// Créer un client Resty
client := resty.New()
// Définir les paramètres de requête
resp, err := client.R().
SetQueryParams(map[string]string{
"page_no": "1",
"limit": "20",
"sort":"name",
"order": "asc",
"random":strconv.FormatInt(time.Now().Unix(), 10),
}).
SetHeader("Accept", "application/json").
SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F").
Get("/search_result")
// Exemple utilisant la méthode Request.SetQueryString
resp, err := client.R().
SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more").
SetHeader("Accept", "application/json").
SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F").
Get("/show_product")
// Si nécessaire, forcer le type de contenu de réponse spécifié pour indiquer à Resty de parser la réponse JSON dans votre structure
resp, err := client.R().
SetResult(result).
ForceContentType("application/json").
Get("v2/alpine/manifests/latest")
Divers exemples de demandes POST
// Créer un client Resty
client := resty.New()
// POST d'une chaîne JSON
// Si des paramètres ont été définis au niveau du client, le type de contenu n'a pas besoin d'être défini
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody(`{"username":"testuser", "password":"testpass"}`).
SetResult(&AuthSuccess{}). // ou SetResult(AuthSuccess{}).
Post("https://myapp.com/login")
// POST d'un tableau []byte
// Si des paramètres ont été définis au niveau du client, le type de contenu n'a pas besoin d'être défini
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody([]byte(`{"username":"testuser", "password":"testpass"}`)).
SetResult(&AuthSuccess{}). // ou SetResult(AuthSuccess{}).
Post("https://myapp.com/login")
// POST d'une structure, par défaut au format JSON, pas besoin de définir
resp, err := client.R().
SetBody(User{Username: "testuser", Password: "testpass"}).
SetResult(&AuthSuccess{}). // ou SetResult(AuthSuccess{}).
SetError(&AuthError{}). // ou SetError(AuthError{}).
Post("https://myapp.com/login")
// POST d'une carte, par défaut au format JSON, pas besoin de définir
resp, err := client.R().
SetBody(map[string]interface{}{"username": "testuser", "password": "testpass"}).
SetResult(&AuthSuccess{}). // ou SetResult(AuthSuccess{}).
SetError(&AuthError{}). // ou SetError(AuthError{}).
Post("https://myapp.com/login")
// Téléverser un fichier en tant que tableau de bytes brut. Exemple : Téléverser un fichier vers Dropbox
fileBytes, _ := os.ReadFile("/Users/jeeva/mydocument.pdf")
// Noter que nous ne définissons pas l'en-tête de type de contenu car go-resty détecte automatiquement le Content-Type
resp, err := client.R().
SetBody(fileBytes).
SetContentLength(true). // Dropbox le requiert
SetAuthToken("").
SetError(&DropboxError{}). // ou SetError(DropboxError{}).
Post("https://content.dropboxapi.com/1/files_put/auto/resty/mydocument.pdf") // Dropbox prend également en charge les téléversements de méthode PUT
// Remarque : Si l'en-tête de type de contenu n'est pas défini, resty détectera le Content-Type du corps de la requête
// * Pour les types de données struct et map, il est par défaut 'application/json'
// * Alors c'est le type de contenu texte normal
Requête PUT
Vous pouvez utiliser diverses combinaisons d'appels de méthode PUT
comme démontré pour POST
.
// Remarque : Ceci est un exemple d'utilisation de la méthode PUT, pour plus de combinaisons, veuillez vous référer à POST
// Créer un client Resty
client := resty.New()
// Envoyer une requête avec un type de contenu JSON
// Si des paramètres sont définis au niveau du client, le jeton d'authentification peut être omis, erreur
resp, err := client.R().
SetBody(Article{
Title: "go-resty",
Content: "Ceci est le contenu de mon article, oh ouais !",
Author: "Jeevanandam M",
Tags: []string{"article", "exemple", "resty"},
}).
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Ou SetError(Error{}).
Put("https://monapp.com/article/1234")
Requête PATCH
Vous pouvez utiliser diverses combinaisons d'appels de méthode PATCH
comme démontré pour POST
.
// Remarque : Ceci est un exemple d'utilisation de la méthode PATCH, pour plus de combinaisons, veuillez vous référer à POST
// Créer un client Resty
client := resty.New()
// Envoyer une requête avec un type de contenu JSON
// Si des paramètres sont définis au niveau du client, le jeton d'authentification peut être omis, erreur
resp, err := client.R().
SetBody(Article{
Tags: []string{"nouveau tag 1", "nouveau tag 2"},
}).
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Ou SetError(Error{}).
Patch("https://monapp.com/articles/1234")
Requête DELETE, HEAD, OPTIONS
// Créer un client Resty
client := resty.New()
// Supprimer un article
// Si des paramètres sont définis au niveau du client, le jeton d'authentification peut être omis, erreur
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Ou SetError(Error{}).
Delete("https://monapp.com/articles/1234")
// Supprimer plusieurs articles avec une chaîne JSON comme charge/contenu
// Si des paramètres sont définis au niveau du client, le jeton d'authentification peut être omis, erreur
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Ou SetError(Error{}).
SetHeader("Content-Type", "application/json").
SetBody(`{article_ids: [1002, 1006, 1007, 87683, 45432] }`).
Delete("https://monapp.com/articles")
// Obtenir les informations d'en-tête d'une ressource
// Si des paramètres sont définis au niveau du client, le jeton d'authentification peut être omis
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
Head("https://monapp.com/videos/hi-res-video")
// Obtenir les informations relatives aux options d'une ressource
// Si des paramètres sont définis au niveau du client, le jeton d'authentification peut être omis
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
Options("https://monapp.com/servers/nyc-dc-01")
Configuration des opérations de sérialisation/désérialisation JSON et XML
Les utilisateurs peuvent enregistrer leur bibliothèque JSON/XML choisie avec Resty, ou écrire leurs propres bibliothèques. Par défaut, Resty enregistre les bibliothèques standard encoding/json
et encoding/xml
.
// Exemple d'enregistrement de json-iterator
import jsoniter "github.com/json-iterator/go"
json := jsoniter.ConfigCompatibleWithStandardLibrary
client := resty.New().
SetJSONMarshaler(json.Marshal).
SetJSONUnmarshaler(json.Unmarshal)
// De même, les utilisateurs peuvent configurer XML comme suit -
client.SetXMLMarshaler(xml.Marshal).
SetXMLUnmarshaler(xml.Unmarshal)