Go Resty ist eine Go-Sprachbibliothek für den Aufbau von RESTful-API-Clients. Mit Go Resty können Entwickler zuverlässige RESTful-API-Clients schneller und effizienter erstellen. In diesem Kapitel wird erläutert, wie Sie schnell mit Go Resty starten können.

Installation

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

oder

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

Resty Beispiel

Die folgenden Beispiele sollen Ihnen helfen, die Resty-Bibliothek so komfortabel wie möglich zu nutzen.

// Importieren Sie resty in Ihren Code und beziehen Sie es als `resty`.
import "github.com/go-resty/resty/v2"

Einfacher GET-Request

// Erstellen Sie einen Resty-Client
client := resty.New()

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

// Untersuchen des Antwortobjekts
fmt.Println("Response Info:")
fmt.Println("  Fehler      :", err)
fmt.Println("  Statuscode  :", resp.StatusCode())
fmt.Println("  Status      :", resp.Status())
fmt.Println("  Protokoll   :", resp.Proto())
fmt.Println("  Zeit        :", resp.Time())
fmt.Println("  Empfangen   :", resp.ReceivedAt())
fmt.Println("  Body        :\n", resp)
fmt.Println()

// Untersuchen der Tracking-Informationen
fmt.Println("Anfrage-Trace-Info:")
ti := resp.Request.TraceInfo()
fmt.Println("  DNS-Suche        :", ti.DNSLookup)
fmt.Println("  Verbindungszeit  :", ti.ConnTime)
fmt.Println("  TCP-Verbindungszeit:", ti.TCPConnTime)
fmt.Println("  TLS-Handshake    :", ti.TLSHandshake)
fmt.Println("  Serverzeit       :", ti.ServerTime)
fmt.Println("  Antwortzeit      :", ti.ResponseTime)
fmt.Println("  Gesamtzeit       :", ti.TotalTime)
fmt.Println("  Wird Verbindung wiederverwendet  :", ti.IsConnReused)
fmt.Println("  Verbindung war untätig  :", ti.IsConnWasIdle)
fmt.Println("  Untätige Zeit der Verbindung :", ti.ConnIdleTime)
fmt.Println("  Anfrageversuch   :", ti.RequestAttempt)
fmt.Println("  Remote-Adresse   :", ti.RemoteAddr.String())
Ausgabe
Response Info:
  Fehler      : 
  Statuscode  : 200
  Status      : 200 OK
  Protokoll   : HTTP/2.0
  Zeit        : 457.034718ms
  Empfangen   : 2020-09-14 15:35:29.784681 -0700 PDT m=+0.458137045
  Body        :
  {
    "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"
  }

Anfrage-Trace-Info:
  DNS-Suche        : 4.074657ms
  Verbindungszeit  : 381.709936ms
  TCP-Verbindungszeit: 77.428048ms
  TLS-Handshake    : 299.623597ms
  Serverzeit       : 75.414703ms
  Antwortzeit      : 79.337µs
  Gesamtzeit       : 457.034718ms
  Wird Verbindung wiederverwendet  : false
  Verbindung war untätig  : false
  Untätige Zeit der Verbindung : 0s
  Anfrageversuch   : 1
  Remote-Adresse   : 3.221.81.55:443

Komplexer GET-Request

// Resty-Client erstellen
client := resty.New()

// Abfrageparameter setzen
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")


// Beispiel für die Verwendung der Request.SetQueryString-Methode
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")


// Falls erforderlich, zwingen Sie den spezifischen Antwort-Content-Typ, um Resty anzuweisen, die JSON-Antwort in Ihre Struktur zu parsen
resp, err := client.R().
      SetResult(result).
      ForceContentType("application/json").
      Get("v2/alpine/manifests/latest")

Verschiedene Beispiele für POST-Requests

// Resty-Client erstellen
client := resty.New()

// JSON-Zeichenkette posten
// Wenn auf Clientebene Einstellungen festgelegt wurden, muss der Content-Type nicht gesetzt werden
resp, err := client.R().
      SetHeader("Content-Type", "application/json").
      SetBody(`{"username":"testuser", "password":"testpass"}`).
      SetResult(&AuthSuccess{}).    // oder SetResult(AuthSuccess{}).
      Post("https://myapp.com/login")

// []byte-Array posten
// Wenn auf Clientebene Einstellungen festgelegt wurden, muss der Content-Type nicht gesetzt werden
resp, err := client.R().
      SetHeader("Content-Type", "application/json").
      SetBody([]byte(`{"username":"testuser", "password":"testpass"}`)).
      SetResult(&AuthSuccess{}).    // oder SetResult(AuthSuccess{}).
      Post("https://myapp.com/login")

// Struktur posten, standardmäßig JSON-Content-Typ, muss nicht gesetzt werden
resp, err := client.R().
      SetBody(User{Username: "testuser", Password: "testpass"}).
      SetResult(&AuthSuccess{}).    // oder SetResult(AuthSuccess{}).
      SetError(&AuthError{}).       // oder SetError(AuthError{}).
      Post("https://myapp.com/login")

// Map posten, standardmäßig JSON-Content-Typ, muss nicht gesetzt werden
resp, err := client.R().
      SetBody(map[string]interface{}{"username": "testuser", "password": "testpass"}).
      SetResult(&AuthSuccess{}).    // oder SetResult(AuthSuccess{}).
      SetError(&AuthError{}).       // oder SetError(AuthError{}).
      Post("https://myapp.com/login")

// Datei als Raw-Byte-Array hochladen. Beispiel: Eine Datei in Dropbox hochladen
fileBytes, _ := os.ReadFile("/Users/jeeva/mydocument.pdf")

// Beachten Sie, dass wir den Content-Type-Header nicht setzen, da go-resty automatisch den Content-Type erkennt
resp, err := client.R().
      SetBody(fileBytes).
      SetContentLength(true).          // Dropbox erfordert diesen Wert
      SetAuthToken("").
      SetError(&DropboxError{}).       // oder SetError(DropboxError{}).
      Post("https://content.dropboxapi.com/1/files_put/auto/resty/mydocument.pdf") // DropBox unterstützt auch das Hochladen per PUT-Methode

// Hinweis: Wenn der Content-Type-Header nicht gesetzt ist, erkennt Resty den Content-Type des Anforderungskörpers automatisch
//   * Bei Struktur- und Mappendaten-Typen ist standardmäßig 'application/json'
//   * Ansonsten ist es der normale Text-Content-Type

PUT-Anforderung

Sie können verschiedene Kombinationen des PUT-Methodenaufrufs verwenden, ähnlich wie für POST dargestellt.

// Hinweis: Dies ist ein Beispiel für die Verwendung der PUT-Methode, für weitere Kombinationen siehe bitte POST

// Erstellen Sie einen Resty-Client
client := resty.New()

// Senden Sie die Anfrage mit dem JSON-Inhaltstyp
// Sofern esEinstellungen auf Client-Ebene gibt, kann das Authentifizierungstoken ausgelassen werden, Fehler
resp, err := client.R().
      SetBody(Article{
        Title: "go-resty",
        Content: "Dies ist mein Artikelinhalt, oh ja!",
        Author: "Jeevanandam M",
        Tags: []string{"Artikel", "Beispiel", "resty"},
      }).
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      SetError(&Error{}).       // Oder SetError(Error{}).
      Put("https://myapp.com/article/1234")

PATCH-Anforderung

Sie können verschiedene Kombinationen des PATCH-Methodenaufrufs verwenden, ähnlich wie für POST dargestellt.

// Hinweis: Dies ist ein Beispiel für die Verwendung der PATCH-Methode, für weitere Kombinationen siehe bitte POST

// Erstellen Sie einen Resty-Client
client := resty.New()

// Senden Sie die Anfrage mit dem JSON-Inhaltstyp
// Sofern esEinstellungen auf Client-Ebene gibt, kann das Authentifizierungstoken ausgelassen werden, Fehler
resp, err := client.R().
      SetBody(Article{
        Tags: []string{"Neues Tag 1", "Neues Tag 2"},
      }).
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      SetError(&Error{}).       // Oder SetError(Error{}).
      Patch("https://myapp.com/articles/1234")

DELETE-, HEAD- und OPTIONS-Anfrage

// Erstellen Sie einen Resty-Client
client := resty.New()

// Löschen eines Artikels
// Sofern esEinstellungen auf Client-Ebene gibt, kann das Authentifizierungstoken ausgelassen werden, Fehler
resp, err := client.R().
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      SetError(&Error{}).       // Oder SetError(Error{}).
      Delete("https://myapp.com/articles/1234")

// Löschen mehrerer Artikel mit JSON-String als Nutzlast/Inhalt
// Sofern esEinstellungen auf Client-Ebene gibt, kann das Authentifizierungstoken ausgelassen werden, Fehler
resp, err := client.R().
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      SetError(&Error{}).       // Oder SetError(Error{}).
      SetHeader("Content-Type", "application/json").
      SetBody(`{article_ids: [1002, 1006, 1007, 87683, 45432] }`).
      Delete("https://myapp.com/articles")

// Informationen zum Header einer Ressource abrufen
// Sofern esEinstellungen auf Client-Ebene gibt, kann das Authentifizierungstoken ausgelassen werden
resp, err := client.R().
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      Head("https://myapp.com/videos/hi-res-video")

// Informationen zu den Optionen einer Ressource abrufen
// Sofern esEinstellungen auf Client-Ebene gibt, kann das Authentifizierungstoken ausgelassen werden
resp, err := client.R().
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      Options("https://myapp.com/servers/nyc-dc-01")

Einrichten von JSON- und XML-Serialisierungs-/Deserialisierungsoperationen

Benutzer können ihre bevorzugten JSON/XML-Bibliotheken mit Resty registrieren oder ihre eigenen Bibliotheken schreiben. Standardmäßig registriert Resty die Standardbibliotheken encoding/json und encoding/xml.

// Beispiel zur Registrierung von json-iterator
import jsoniter "github.com/json-iterator/go"

json := jsoniter.ConfigCompatibleWithStandardLibrary

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

// Ebenso können Benutzer XML wie folgt einrichten -
client.SetXMLMarshaler(xml.Marshal).
    SetXMLUnmarshaler(xml.Unmarshal)