ایجاد درخواست های HTTP مانند Pro in Go: استفاده از Go -Resty با Goframe 🚀 – Community Dev

سلام آنجا ، همکار Gophers! 👋
تا به حال خود را با درخواست HTTP در GO کشتی پیدا کرده اید؟ شاید شما در حال ساختن خدمتی باشید که باید با چندین API صحبت کند ، یا فقط از نوشتن کد مشتری HTTP BoilerPlate خسته شده اید. خوب ، من چیزی دارم که ممکن است زندگی شما را آسانتر کند!
در این راهنما ، من به شما نشان می دهم که چگونه از آن استفاده کنید go-resty
– یک کتابخانه مشتری HTTP غنی از ویژگی – در چارچوب Goframe برای صاف کردن و حفظ ادغام API شما. به من اعتماد کن ، خود آینده شما از شما متشکرم!
چرا استراحت؟ 🤔
قبل از شیرجه رفتن ، ممکن است تعجب کنید: “چرا فقط از استاندارد استفاده نکنید net/http
بسته؟ “سوال خوب! در حالی که مشتری استاندارد HTTP GO قدرتمند است ، go-resty
لایه ای از راحتی را با:
- روشهای زنجیره ای (کد Verbose Bye-bye!)
- مکانیسم های آزمایشگاهی داخلی
- پاسخ خودکار غیرقانونی
- درخواست/پاسخ پشتیبانی میان افزار
- و خیلی بیشتر!
شروع کار
اولین چیزها ابتدا ، بیایید ابزارهای خود را آماده کنیم. شما نیاز به نصب دارید (فرض می کنم شما آن را پوشانده اید!) ، سپس اجرا کنید:
go install github.com/gogf/gf/v2/cmd/gf@latest
go get github.com/go-resty/resty/v2
اولین درخواست شما
بیایید با چیزی ساده شروع کنیم. در اینجا نحوه درخواست دریافت دریافت می کنید:
import (
"github.com/go-resty/resty/v2"
"github.com/gogf/gf/v2/frame/g"
)
func main() {
// Create a client (tip: reuse this client!)
client := resty.New()
// Make a request
resp, err := client.R().
SetQueryParams(map[string]string{
"page": "1",
"limit": "10",
}).
Get("https://api.example.com/users")
if err != nil {
g.Log().Errorf(ctx, "Oops! Something went wrong: %v", err)
return
}
// Use the response
fmt.Printf("Status: %v\n", resp.Status())
fmt.Printf("Body: %v\n", resp.String())
}
بسیار تمیز ، درست است؟ 😎
ارسال داده ها آسان ساخته شده است
آیا نیاز به ارسال برخی از داده ها دارید؟ در اینجا نحوه درخواست پست ارائه شده است:
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody(map[string]interface{}{
"username": "gopher",
"email": "gopher@go.dev",
}).
Post("https://api.example.com/users")
اشکال زدایی مانند یک حرفه ای
در حین توسعه ، می خواهید با درخواست های شما چه اتفاقی می افتد. فقط اضافه کنید:
client.SetDebug(true)
اکنون سیاهههای مربوط به درخواست ها و پاسخ های خود را مشاهده خواهید کرد. فوق العاده مفید برای اشکال زدایی!
دست زدن به زمان مانند رئیس
در دنیای واقعی ، همه چیز اشتباه می شود. در اینجا نحوه رسیدگی به زمان های با لطف آورده شده است:
// Global timeout for all requests
client := resty.New().
SetTimeout(5 * time.Second)
// Or for a specific request
resp, err := client.R().
SetTimeout(3 * time.Second).
Get("https://api.example.com/users")
// Check for timeout errors
if err != nil {
if errors.Is(err, context.DeadlineExceeded) {
fmt.Println("Request timed out! 😱")
return
}
fmt.Printf("Other error: %v\n", err)
}
مکانیسم آزمایش مجدد: زیرا گاهی اوقات اوضاع شکست می خورد
در اینجا یک نمونه در دنیای واقعی تنظیم احیای API های پوسته پوسته وجود دارد:
client.
SetRetryCount(3).
SetRetryWaitTime(5 * time.Second).
SetRetryMaxWaitTime(20 * time.Second).
AddRetryCondition(
func(r *resty.Response, err error) bool {
return r.StatusCode() >= 500 // Retry on server errors
},
)
احراز هویت ساده ساخته شده است
آیا نیاز به اضافه کردن هدرهای AUTH به هر درخواست دارید؟ از میان افزار استفاده کنید:
client.OnBeforeRequest(func(c *resty.Client, req *resty.Request) error {
req.SetHeader("Authorization", "Bearer " + getToken())
return nil
})
نکات حرفه ای
- استفاده مجدد از مشتریان: یک مشتری ایجاد کنید و از آن استفاده مجدد کنید. برای هر درخواست مشتری جدیدی ایجاد نکنید!
- متن دوست شماست: از زمینه برای کنترل بهتر بر روی چرخه های عمر درخواست استفاده کنید:
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
resp, err := client.R().
SetContext(ctx).
Get("https://api.example.com/users")
- پاسخ ها را به درستی انجام دهید: همیشه خطا و کد وضعیت را بررسی کنید:
if err != nil {
return fmt.Errorf("request failed: %w", err)
}
if resp.StatusCode() >= 400 {
return fmt.Errorf("bad status: %s", resp.Status())
}
مثال در دنیای واقعی: ایجاد یک سرویس هواشناسی 🌤
بیایید همه اینها را با یک مثال عملی کنار هم قرار دهیم – یک سرویس هواشناسی که دارای تدابیر ، زمان بندی و موارد خطا است:
func NewWeatherService() *WeatherService {
client := resty.New().
SetTimeout(10 * time.Second).
SetRetryCount(3).
SetRetryWaitTime(1 * time.Second).
SetHostURL("https://api.weatherapi.com/v1")
return &WeatherService{client: client}
}
func (s *WeatherService) GetCurrentWeather(ctx context.Context, city string) (*WeatherData, error) {
var result WeatherData
resp, err := s.client.R().
SetQueryParam("q", city).
SetQueryParam("key", os.Getenv("WEATHER_API_KEY")).
SetResult(&result).
SetContext(ctx).
Get("/current.json")
if err != nil {
return nil, fmt.Errorf("weather request failed: %w", err)
}
if resp.IsError() {
return nil, fmt.Errorf("weather API error: %s", resp.String())
}
return &result, nil
}
بسته بندی
Go Bret با Goframe ترکیبی قدرتمند برای رسیدگی به درخواست های HTTP در GO است. این یک API تمیز را فراهم می کند در حالی که تمام ابزارهای مورد نیاز برای کد آماده تولید را به شما می دهد.
به یاد داشته باشید:
- مشتریان خود را قابل استفاده مجدد نگه دارید
- زمان های مناسب را تنظیم کنید
- برای مقاومت در برابر احیا استفاده کنید
- خطاها را با لطف انجام دهید
حالا بروید و چیزهای عالی بسازید! 🚀
بیشتر می خواهید؟ 📚
- برای ویژگی های بیشتر اسناد Go Breaty را بررسی کنید
- برای توسعه کامل پشته Goframe را کاوش کنید
- برای بیشتر نکات و ترفندها مرا دنبال کنید!
آیا این به شما کمک کرده است؟ سوالات دارید؟ نظر زیر را رها کنید! 👇