Go Resty to biblioteka języka Go służąca do budowania klientów interfejsu API RESTful. Dzięki Go Resty, programiści mogą szybciej i bardziej efektywnie budować niezawodnych klientów interfejsu API RESTful. Ten rozdział przedstawia, jak szybko rozpocząć pracę z Go Resty.
Instalacja
require github.com/go-resty/resty/v2 v2.7.0
lub
go get github.com/go-resty/resty/v2
Przykład użycia Resty
Poniższe przykłady pomogą Ci jak najbardziej komfortowo korzystać z biblioteki resty.
// Importuj resty do swojego kodu i odwołuj się do niego jako `resty`.
import "github.com/go-resty/resty/v2"
Proste żądanie GET
// Utwórz klienta Resty
client := resty.New()
resp, err := client.R().
EnableTrace().
Get("https://httpbin.org/get")
// Eksploruj obiekt odpowiedzi
fmt.Println("Informacje o odpowiedzi:")
fmt.Println(" Błąd :", err)
fmt.Println(" Kod stanu :", resp.StatusCode())
fmt.Println(" Status :", resp.Status())
fmt.Println(" Protokół :", resp.Proto())
fmt.Println(" Czas :", resp.Time())
fmt.Println(" Odebrane o :", resp.ReceivedAt())
fmt.Println(" Treść :\n", resp)
fmt.Println()
// Eksploruj informacje śledzenia
fmt.Println("Informacje śledzenia żądania:")
ti := resp.Request.TraceInfo()
fmt.Println(" Wyszukiwanie DNS :", ti.DNSLookup)
fmt.Println(" Czas połączenia :", ti.ConnTime)
fmt.Println(" Czas połączenia TCP :", ti.TCPConnTime)
fmt.Println(" Ustalenie połączenia TLS:", ti.TLSHandshake)
fmt.Println(" Czas serwera :", ti.ServerTime)
fmt.Println(" Czas odpowiedzi :", ti.ResponseTime)
fmt.Println(" Całkowity czas :", ti.TotalTime)
fmt.Println(" Czy połączenie było ponownie używane :", ti.IsConnReused)
fmt.Println(" Połączenie było bezczynne :", ti.IsConnWasIdle)
fmt.Println(" Czas bezczynności połączenia:", ti.ConnIdleTime)
fmt.Println(" Próba żądania :", ti.RequestAttempt)
fmt.Println(" Adres zdalny :", ti.RemoteAddr.String())
Output
Informacje o odpowiedzi:
Błąd :
Kod stanu : 200
Status : 200 OK
Protokół : HTTP/2.0
Czas : 457.034718ms
Odebrane o : 2020-09-14 15:35:29.784681 -0700 PDT m=+0.458137045
Treść :
{
"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"
}
Informacje śledzenia żądania:
Wyszukiwanie DNS : 4.074657ms
Czas połączenia : 381.709936ms
Czas połączenia TCP : 77.428048ms
Ustalenie połączenia TLS: 299.623597ms
Czas serwera : 75.414703ms
Czas odpowiedzi : 79.337µs
Całkowity czas : 457.034718ms
Czy połączenie było ponownie używane : false
Połączenie było bezczynne : false
Czas bezczynności połączenia: 0s
Próba żądania : 1
Adres zdalny : 3.221.81.55:443
Złożony żądanie GET
// Utwórz klienta Resty
client := resty.New()
// Ustaw parametry zapytania
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")
// Przykład użycia metody 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")
// Jeśli konieczne, wymuś określony typ zawartości odpowiedzi, aby Resty mógł sparsować odpowiedź JSON do twojej struktury
resp, err := client.R().
SetResult(result).
ForceContentType("application/json").
Get("v2/alpine/manifests/latest")
Różne przykłady żądań POST
// Utwórz klienta Resty
client := resty.New()
// POST ciąg JSON
// Jeśli ustawiono ustawienia na poziomie klienta, typ zawartości nie musi być ustawiony
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody(`{"username":"testuser", "password":"testpass"}`).
SetResult(&AuthSuccess{}). // lub SetResult(AuthSuccess{}).
Post("https://myapp.com/login")
// POST tablicę []byte
// Jeśli ustawiono ustawienia na poziomie klienta, typ zawartości nie musi być ustawiony
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody([]byte(`{"username":"testuser", "password":"testpass"}`)).
SetResult(&AuthSuccess{}). // lub SetResult(AuthSuccess{}).
Post("https://myapp.com/login")
// POST strukturę, domyślnie typ zawartości JSON, nie ma potrzeby ustawiania
resp, err := client.R().
SetBody(User{Username: "testuser", Password: "testpass"}).
SetResult(&AuthSuccess{}). // lub SetResult(AuthSuccess{}).
SetError(&AuthError{}). // lub SetError(AuthError{}).
Post("https://myapp.com/login")
// POST mapę, domyślnie typ zawartości JSON, nie ma potrzeby ustawiania
resp, err := client.R().
SetBody(map[string]interface{}{"username": "testuser", "password": "testpass"}).
SetResult(&AuthSuccess{}). // lub SetResult(AuthSuccess{}).
SetError(&AuthError{}). // lub SetError(AuthError{}).
Post("https://myapp.com/login")
// Prześlij plik jako surową tablicę bajtów. Przykład: Prześlij plik do Dropbox
fileBytes, _ := os.ReadFile("/Users/jeeva/mydocument.pdf")
// Zauważ, że nie ustawiamy nagłówka typu zawartości, ponieważ go-resty automatycznie wykryje Content-Type
resp, err := client.R().
SetBody(fileBytes).
SetContentLength(true). // Dropbox wymaga tego wartości
SetAuthToken("").
SetError(&DropboxError{}). // lub SetError(DropboxError{}).
Post("https://content.dropboxapi.com/1/files_put/auto/resty/mydocument.pdf") // Dropbox obsługuje również przesyłanie metodą PUT
// Uwaga: Jeśli nagłówek typu zawartości nie jest ustawiony, resty wykryje Content-Type ciała żądania
// * Dla typów danych struct i map, domyślnie jest to 'application/json'
// * Następnie jest to normalny typ zawartości tekstowej
Żądanie PUT
Możesz użyć różnych kombinacji wywołania metody PUT
tak jak pokazano dla POST
.
// Uwaga: Jest to przykład użycia metody PUT, dla większej liczby kombinacji proszę odnosić się do POST
// Utwórz klienta Resty
client := resty.New()
// Wyślij żądanie z typem zawartości JSON
// Jeżeli istnieją ustawienia na poziomie klienta, token uwierzytelniający może zostać pominięty, błąd
resp, err := client.R().
SetBody(Article{
Title: "go-resty",
Content: "To jest treść mojego artykułu, oh yeah!",
Author: "Jeevanandam M",
Tags: []string{"artykuł", "przykład", "resty"},
}).
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Lub SetError(Error{}).
Put("https://myapp.com/article/1234")
Żądanie PATCH
Możesz użyć różnych kombinacji wywołania metody PATCH
tak jak pokazano dla POST
.
// Uwaga: Jest to przykład użycia metody PATCH, dla większej liczby kombinacji proszę odnosić się do POST
// Utwórz klienta Resty
client := resty.New()
// Wyślij żądanie z typem zawartości JSON
// Jeżeli istnieją ustawienia na poziomie klienta, token uwierzytelniający może zostać pominięty, błąd
resp, err := client.R().
SetBody(Article{
Tags: []string{"nowy tag 1", "nowy tag 2"},
}).
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Lub SetError(Error{}).
Patch("https://myapp.com/articles/1234")
Żądanie DELETE, HEAD, OPTIONS
// Utwórz klienta Resty
client := resty.New()
// Usuń artykuł
// Jeżeli istnieją ustawienia na poziomie klienta, token uwierzytelniający może zostać pominięty, błąd
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Lub SetError(Error{}).
Delete("https://myapp.com/articles/1234")
// Usuń wiele artykułów z ładunkiem/zawartością JSON jako ciąg znaków
// Jeżeli istnieją ustawienia na poziomie klienta, token uwierzytelniający może zostać pominięty, błąd
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Lub SetError(Error{}).
SetHeader("Content-Type", "application/json").
SetBody(`{article_ids: [1002, 1006, 1007, 87683, 45432] }`).
Delete("https://myapp.com/articles")
// Pobierz informacje o nagłówku zasobu
// Jeżeli istnieją ustawienia na poziomie klienta, token uwierzytelniający może zostać pominięty
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
Head("https://myapp.com/videos/hi-res-video")
// Pobierz informacje o opcjach zasobu
// Jeżeli istnieją ustawienia na poziomie klienta, token uwierzytelniający może zostać pominięty
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
Options("https://myapp.com/servers/nyc-dc-01")
Konfiguracja operacji serializacji/deserializacji JSON i XML
Użytkownicy mogą zarejestrować wybrane biblioteki JSON/XML w Resty lub napisać własne biblioteki. Domyślnie Resty rejestruje standardowe biblioteki encoding/json
i encoding/xml
.
// Przykład rejestracji json-iterator
import jsoniter "github.com/json-iterator/go"
json := jsoniter.ConfigCompatibleWithStandardLibrary
client := resty.New().
SetJSONMarshaler(json.Marshal).
SetJSONUnmarshaler(json.Unmarshal)
// Podobnie, użytkownicy mogą skonfigurować XML w następujący sposób -
client.SetXMLMarshaler(xml.Marshal).
SetXMLUnmarshaler(xml.Unmarshal)