Materiali tecnici

Go Resty è una libreria del linguaggio Go per la costruzione di client API RESTful. Con Go Resty, gli sviluppatori possono costruire client API RESTful affidabili in modo più rapido ed efficiente. Questo capitolo presenta come iniziare rapidamente con Go Resty.

Installazione

require github.com/go-resty/resty/v2 v2.7.0

o

go get github.com/go-resty/resty/v2

Esempio di Resty

Gli esempi seguenti ti aiuteranno a utilizzare la libreria resty nel modo più comodo possibile.

// Importa resty nel tuo codice e riferisciti ad esso come `resty`.
import "github.com/go-resty/resty/v2"

Richiesta GET semplice

// Crea un client Resty
client := resty.New()

resp, err := client.R().
    EnableTrace().
    Get("https://httpbin.org/get")

// Esplora l'oggetto di risposta
fmt.Println("Informazioni sulla risposta:")
fmt.Println("  Errore      :", err)
fmt.Println("  Codice di stato:", resp.StatusCode())
fmt.Println("  Stato     :", resp.Status())
fmt.Println("  Protocollo   :", resp.Proto())
fmt.Println("  Tempo       :", resp.Time())
fmt.Println("  Ricevuto il:", resp.ReceivedAt())
fmt.Println("  Corpo       :\n", resp)
fmt.Println()

// Esplora le informazioni di tracciamento
fmt.Println("Informazioni di tracciamento della richiesta:")
ti := resp.Request.TraceInfo()
fmt.Println("  Ricerca DNS      :", ti.DNSLookup)
fmt.Println("  Tempo di connessione    :", ti.ConnTime)
fmt.Println("  Tempo di connessione TCP:", ti.TCPConnTime)
fmt.Println("  Handshake TLS   :", ti.TLSHandshake)
fmt.Println("  Tempo del server     :", ti.ServerTime)
fmt.Println("  Tempo di risposta   :", ti.ResponseTime)
fmt.Println("  Tempo totale      :", ti.TotalTime)
fmt.Println("  Connessione riutilizzata  :", ti.IsConnReused)
fmt.Println("  Connessione era inattiva   :", ti.IsConnWasIdle)
fmt.Println("  Tempo inattiva connessione  :", ti.ConnIdleTime)
fmt.Println("  Tentativo di richiesta :", ti.RequestAttempt)
fmt.Println("  Indirizzo remoto  :", ti.RemoteAddr.String())
Output
Informazioni sulla risposta:
  Errore      : 
  Codice di stato: 200
  Stato     : 200 OK
  Protocollo   : HTTP/2.0
  Tempo       : 457.034718ms
  Ricevuto il: 2020-09-14 15:35:29.784681 -0700 PDT m=+0.458137045
  Corpo       :
  {
    "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"
  }

Informazioni di tracciamento della richiesta:
  Ricerca DNS      : 4.074657ms
  Tempo di connessione    : 381.709936ms
  Tempo di connessione TCP: 77.428048ms
  Handshake TLS   : 299.623597ms
  Tempo del server     : 75.414703ms
  Tempo di risposta   : 79.337µs
  Tempo totale      : 457.034718ms
  Connessione riutilizzata  : false
  Connessione era inattiva   : false
  Tempo inattiva connessione  : 0s
  Tentativo di richiesta : 1
  Indirizzo remoto  : 3.221.81.55:443

Complesso di richiesta GET

// Creare un client Resty
client := resty.New()

// Impostare i parametri della query
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")


// Esempio con il metodo 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")


// Se necessario, forzare il tipo di contenuto di risposta specificato per istruire Resty a analizzare la risposta JSON nella tua struttura
resp, err := client.R().
      SetResult(result).
      ForceContentType("application/json").
      Get("v2/alpine/manifests/latest")

Vari esempi di richiesta POST

// Creare un client Resty
client := resty.New()

// POST della stringa JSON
// Se sono stati impostati i settaggi a livello di client, non è necessario impostare il tipo di contenuto
resp, err := client.R().
      SetHeader("Content-Type", "application/json").
      SetBody(`{"username":"testuser", "password":"testpass"}`).
      SetResult(&AuthSuccess{}).    // o SetResult(AuthSuccess{}).
      Post("https://myapp.com/login")

// POST di un array []byte
// Se sono stati impostati i settaggi a livello di client, non è necessario impostare il tipo di contenuto
resp, err := client.R().
      SetHeader("Content-Type", "application/json").
      SetBody([]byte(`{"username":"testuser", "password":"testpass"}`)).
      SetResult(&AuthSuccess{}).    // o SetResult(AuthSuccess{}).
      Post("https://myapp.com/login")

// POST di una struttura, di default al tipo di contenuto JSON, non è necessario impostarlo
resp, err := client.R().
      SetBody(User{Username: "testuser", Password: "testpass"}).
      SetResult(&AuthSuccess{}).    // o SetResult(AuthSuccess{}).
      SetError(&AuthError{}).       // o SetError(AuthError{}).
      Post("https://myapp.com/login")

// POST di una mappa, di default al tipo di contenuto JSON, non è necessario impostarlo
resp, err := client.R().
      SetBody(map[string]interface{}{"username": "testuser", "password": "testpass"}).
      SetResult(&AuthSuccess{}).    // o SetResult(AuthSuccess{}).
      SetError(&AuthError{}).       // o SetError(AuthError{}).
      Post("https://myapp.com/login")

// Caricare un file come array di byte grezzi. Esempio: Caricare un file su Dropbox
fileBytes, _ := os.ReadFile("/Users/jeeva/mydocument.pdf")

// Nota che non impostiamo l'intestazione del tipo di contenuto perché go-resty rileverà automaticamente il Content-Type
resp, err := client.R().
      SetBody(fileBytes).
      SetContentLength(true).          // Dropbox richiede questo valore
      SetAuthToken("").
      SetError(&DropboxError{}).       // o SetError(DropboxError{}).
      Post("https://content.dropboxapi.com/1/files_put/auto/resty/mydocument.pdf") // Dropbox supporta anche il metodo PUT per gli upload

// Nota: Se l'intestazione del tipo di contenuto non è impostata, resty rileverà il Content-Type del corpo della richiesta
//   * Per le strutture e i tipi di dati mappa, il tipo di contenuto predefinito è 'application/json'
//   * Quindi è il normale tipo di contenuto testuale

Richiesta PUT

È possibile utilizzare varie combinazioni della chiamata al metodo PUT proprio come dimostrato per POST.

// Nota: Questo è un esempio dell'utilizzo del metodo PUT, per ulteriori combinazioni fare riferimento a POST

// Crea un client Resty
client := resty.New()

// Invia la richiesta con il tipo di contenuto JSON
// Se ci sono impostazioni a livello di client, il token di autenticazione può essere omesso, errore
resp, err := client.R().
      SetBody(Article{
        Title: "go-resty",
        Content: "Questo è il contenuto del mio articolo, oh sì!",
        Author: "Jeevanandam M",
        Tags: []string{"articolo", "esempio", "resty"},
      }).
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      SetError(&Error{}).       // O SetError(Error{}).
      Put("https://myapp.com/article/1234")

Richiesta PATCH

È possibile utilizzare varie combinazioni della chiamata al metodo PATCH proprio come dimostrato per POST.

// Nota: Questo è un esempio dell'utilizzo del metodo PATCH, per ulteriori combinazioni fare riferimento a POST

// Crea un client Resty
client := resty.New()

// Invia la richiesta con il tipo di contenuto JSON
// Se ci sono impostazioni a livello di client, il token di autenticazione può essere omesso, errore
resp, err := client.R().
      SetBody(Article{
        Tags: []string{"nuovo tag 1", "nuovo tag 2"},
      }).
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      SetError(&Error{}).       // O SetError(Error{}).
      Patch("https://myapp.com/articles/1234")

Richiesta DELETE, HEAD, OPTIONS

// Crea un client Resty
client := resty.New()

// Elimina un articolo
// Se ci sono impostazioni a livello di client, il token di autenticazione può essere omesso, errore
resp, err := client.R().
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      SetError(&Error{}).       // O SetError(Error{}).
      Delete("https://myapp.com/articles/1234")

// Elimina più articoli con una stringa JSON come payload/contenuto
// Se ci sono impostazioni a livello di client, il token di autenticazione può essere omesso, errore
resp, err := client.R().
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      SetError(&Error{}).       // O SetError(Error{}).
      SetHeader("Content-Type", "application/json").
      SetBody(`{article_ids: [1002, 1006, 1007, 87683, 45432] }`).
      Delete("https://myapp.com/articles")

// Ottieni le informazioni sull'intestazione di una risorsa
// Se ci sono impostazioni a livello di client, il token di autenticazione può essere omesso
resp, err := client.R().
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      Head("https://myapp.com/videos/hi-res-video")

// Ottieni le informazioni sulle opzioni di una risorsa
// Se ci sono impostazioni a livello di client, il token di autenticazione può essere omesso
resp, err := client.R().
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      Options("https://myapp.com/servers/nyc-dc-01")

Configurazione delle operazioni di serializzazione/deserializzazione JSON e XML

Gli utenti possono registrare le proprie librerie JSON/XML preferite con resty, oppure scrivere le proprie librerie. Per impostazione predefinita, resty registra le librerie standard encoding/json e encoding/xml.

// Esempio di registrazione di json-iterator
import jsoniter "github.com/json-iterator/go"

json := jsoniter.ConfigCompatibleWithStandardLibrary

client := resty.New().
    SetJSONMarshaler(json.Marshal).
    SetJSONUnmarshaler(json.Unmarshal)

// Analogamente, gli utenti possono configurare XML come segue:
client.SetXMLMarshaler(xml.Marshal).
    SetXMLUnmarshaler(xml.Unmarshal)