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)