Go Resty, Go dilinde RESTful API istemcileri oluşturmak için kullanılan bir kütüphanedir. Go Resty ile, geliştiriciler daha hızlı ve verimli bir şekilde güvenilir RESTful API istemcileri oluşturabilirler. Bu bölüm, Go Resty ile hızlı bir şekilde nasıl başlanacağını tanıtmaktadır.
Kurulum
require github.com/go-resty/resty/v2 v2.7.0
veya
go get github.com/go-resty/resty/v2
Resty Örneği
Aşağıdaki örnekler, resty kütüphanesini mümkün olduğunca rahat bir şekilde kullanmanıza yardımcı olacaktır.
// Kodunuzda resty'yi içe aktarın ve `resty` olarak başvurun.
import "github.com/go-resty/resty/v2"
Basit GET İsteği
// Bir Resty istemcisi oluştur
client := resty.New()
resp, err := client.R().
EnableTrace().
Get("https://httpbin.org/get")
// Yanıt nesnesini keşfedin
fmt.Println("Yanıt Bilgisi:")
fmt.Println(" Hata :", err)
fmt.Println(" Durum kodu :", resp.StatusCode())
fmt.Println(" Durum :", resp.Status())
fmt.Println(" Protokol :", resp.Proto())
fmt.Println(" Zaman :", resp.Time())
fmt.Println(" Alındı :", resp.ReceivedAt())
fmt.Println(" Gövde :\n", resp)
fmt.Println()
// Takip bilgilerini keşfedin
fmt.Println("İstek takip bilgisi:")
ti := resp.Request.TraceInfo()
fmt.Println(" DNS sorgusu :", ti.DNSLookup)
fmt.Println(" Bağlantı zamanı :", ti.ConnTime)
fmt.Println(" TCP bağlantı zamanı:", ti.TCPConnTime)
fmt.Println(" TLS el sıkışması :", ti.TLSHandshake)
fmt.Println(" Sunucu zamanı :", ti.ServerTime)
fmt.Println(" Yanıt zamanı :", ti.ResponseTime)
fmt.Println(" Toplam zaman :", ti.TotalTime)
fmt.Println(" Bağlantı yeniden :", ti.IsConnReused)
fmt.Println(" Bağlantı boşta :", ti.IsConnWasIdle)
fmt.Println(" Bağlantı boş süre :", ti.ConnIdleTime)
fmt.Println(" İstek denemesi :", ti.RequestAttempt)
fmt.Println(" Uzak adres :", ti.RemoteAddr.String())
Çıktı
Yanıt Bilgisi:
Hata :
Durum kodu : 200
Durum : 200 OK
Protokol : HTTP/2.0
Zaman : 457.034718ms
Alındı : 2020-09-14 15:35:29.784681 -0700 PDT m=+0.458137045
Gövde :
{
"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"
}
İstek takip bilgisi:
DNS sorgusu : 4.074657ms
Bağlantı zamanı : 381.709936ms
TCP bağlantı zamanı: 77.428048ms
TLS el sıkışması : 299.623597ms
Sunucu zamanı : 75.414703ms
Yanıt zamanı : 79.337µs
Toplam zaman : 457.034718ms
Bağlantı yeniden : false
Bağlantı boşta : false
Bağlantı boş süre : 0s
İstek denemesi : 1
Uzak adres : 3.221.81.55:443
Karmaşık GET İsteği
// Resty istemcisi oluştur
client := resty.New()
// Sorgu parametrelerini ayarla
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")
// Request.SetQueryString yöntemini kullanarak örnek
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")
// Gerekirse, belirtilen yanıt içerik türünü zorlayarak Resty'yi JSON yanıtını yapınıza ayrıştırmaya yönlendirebilirsiniz
resp, err := client.R().
SetResult(result).
ForceContentType("application/json").
Get("v2/alpine/manifests/latest")
Çeşitli POST İsteği Örnekleri
// Resty istemcisi oluştur
client := resty.New()
// JSON dizesi gönder
// İstemci düzeyi ayarları yapılmışsa, içerik türünü ayarlamak gerekmez
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody(`{"username":"testuser", "password":"testpass"}`).
SetResult(&AuthSuccess{}). // veya SetResult(AuthSuccess{}).
Post("https://myapp.com/login")
// []byte dizisi gönder
// İstemci düzeyi ayarları yapılmışsa, içerik türünü ayarlamak gerekmez
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody([]byte(`{"username":"testuser", "password":"testpass"}`)).
SetResult(&AuthSuccess{}). // veya SetResult(AuthSuccess{}).
Post("https://myapp.com/login")
// Yapı gönder, varsayılan olarak JSON içerik türü, ayar yapmaya gerek yok
resp, err := client.R().
SetBody(User{Username: "testuser", Password: "testpass"}).
SetResult(&AuthSuccess{}). // veya SetResult(AuthSuccess{}).
SetError(&AuthError{}). // veya SetError(AuthError{}).
Post("https://myapp.com/login")
// Harita gönder, varsayılan olarak JSON içerik türü, ayar yapmaya gerek yok
resp, err := client.R().
SetBody(map[string]interface{}{"username": "testuser", "password": "testpass"}).
SetResult(&AuthSuccess{}). // veya SetResult(AuthSuccess{}).
SetError(&AuthError{}). // veya SetError(AuthError{}).
Post("https://myapp.com/login")
// Dosyayı ham bayt dizisi olarak yükle. Örnek: Bir dosyayı Dropbox'a yükle
fileBytes, _ := os.ReadFile("/Users/jeeva/mydocument.pdf")
// İçerik tipi başlığını ayarlamadığımıza dikkat edin çünkü go-resty otomatik olarak Content-Type'i algılayacaktır
resp, err := client.R().
SetBody(fileBytes).
SetContentLength(true). // Dropbox bunu değer olarak gerektirir
SetAuthToken("").
SetError(&DropboxError{}). // veya SetError(DropboxError{}).
Post("https://content.dropboxapi.com/1/files_put/auto/resty/mydocument.pdf") // DropBox ayrıca PUT yöntemi yüklemelerini destekler
// Not: İçerik tipi başlığı ayarlanmazsa, resty isteğin gövdesinin Content-Type'ini algılar
// * Yapı ve harita veri tipleri için varsayılan olarak 'application/json'
// * Ardından normal metin içerik türü olarak ayarlanır
PUT İsteği
POST
için gösterildiği gibi, PUT
yöntemi çağrısının çeşitli kombinasyonlarını kullanabilirsiniz.
// Not: Bu, PUT yöntemi kullanımına ilişkin bir örnektir, daha fazla kombinasyon için lütfen POST'a bakın
// Bir Resty istemcisi oluştur
client := resty.New()
// JSON içerik tipi ile istek gönder
// İstemci düzeyinde ayarlar varsa, yetkilendirme belirteci atlanabilir, hata
resp, err := client.R().
SetBody(Article{
Title: "go-resty",
Content: "Bu benim makale içeriğim, evet!",
Author: "Jeevanandam M",
Tags: []string{"makale", "örnek", "resty"},
}).
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Veya SetError(Error{}).
Put("https://myapp.com/article/1234")
PATCH İsteği
POST
için gösterildiği gibi, PATCH
yöntemi çağrısının çeşitli kombinasyonlarını kullanabilirsiniz.
// Not: Bu, PATCH yöntemi kullanımına ilişkin bir örnektir, daha fazla kombinasyon için lütfen POST'a bakın
// Bir Resty istemcisi oluştur
client := resty.New()
// JSON içerik tipi ile istek gönder
// İstemci düzeyinde ayarlar varsa, yetkilendirme belirteci atlanabilir, hata
resp, err := client.R().
SetBody(Article{
Tags: []string{"yeni etiket 1", "yeni etiket 2"},
}).
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Veya SetError(Error{}).
Patch("https://myapp.com/articles/1234")
DELETE, HEAD, OPTIONS İsteği
// Bir Resty istemcisi oluştur
client := resty.New()
// Bir makaleyi sil
// İstemci düzeyinde ayarlar varsa, yetkilendirme belirteci atlanabilir, hata
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Veya SetError(Error{}).
Delete("https://myapp.com/articles/1234")
// JSON dizisi olarak içerik/payload ile birden fazla makaleyi sil
// İstemci düzeyinde ayarlar varsa, yetkilendirme belirteci atlanabilir, hata
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // Veya SetError(Error{}).
SetHeader("Content-Type", "application/json").
SetBody(`{article_ids: [1002, 1006, 1007, 87683, 45432] }`).
Delete("https://myapp.com/articles")
// Bir kaynağın başlık bilgilerini al
// İstemci düzeyinde ayarlar varsa, yetkilendirme belirteci atlanabilir
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
Head("https://myapp.com/videos/hi-res-video")
// Bir kaynağın seçenek bilgilerini al
// İstemci düzeyinde ayarlar varsa, yetkilendirme belirteci atlanabilir
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
Options("https://myapp.com/servers/nyc-dc-01")
JSON ve XML Serileştirme/Deserileştirme İşlemlerini Kurma
Kullanıcılar tercih ettikleri JSON/XML kütüphanelerini resty’ye kaydedebilir veya kendi kütüphanelerini yazabilir. Resty, varsayılan olarak standart encoding/json
ve encoding/xml
kütüphanelerini kaydeder.
// json-iterator'ün kaydedilmesi örneği
import jsoniter "github.com/json-iterator/go"
json := jsoniter.ConfigCompatibleWithStandardLibrary
client := resty.New().
SetJSONMarshaler(json.Marshal).
SetJSONUnmarshaler(json.Unmarshal)
// Benzer şekilde, kullanıcılar XML'i aşağıdaki gibi kurabilir -
client.SetXMLMarshaler(xml.Marshal).
SetXMLUnmarshaler(xml.Unmarshal)