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)