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)