Skip to content

超时与重试示例

超时

设置请求超时以防止请求挂起:

go
package main

import (
	"fmt"
	"time"
	"github.com/go-zoox/fetch"
)

func main() {
	response, err := fetch.Get("https://httpbin.zcorky.com/get", &fetch.Config{
		Timeout: 5 * time.Second,
	})
	if err != nil {
		panic(err)
	}

	fmt.Println(response.JSON())
}

使用 Fetch 实例设置超时

go
f := fetch.New()
f.SetTimeout(10 * time.Second)

response, err := f.Get("https://httpbin.zcorky.com/get").Execute()

使用 Context 设置超时

使用 Go 的 context 获得更多控制:

go
package main

import (
	"context"
	"fmt"
	"time"
	"github.com/go-zoox/fetch"
)

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	f := fetch.New()
	f.SetContext(ctx)

	response, err := f.Get("https://httpbin.zcorky.com/get").Execute()
	if err != nil {
		fmt.Println("请求失败:", err)
		return
	}

	fmt.Println(response.JSON())
}

重试

使用 Retry 方法重试失败的请求:

go
f := fetch.New()
f.SetURL("https://httpbin.zcorky.com/get")

response, err := f.Retry(func(nf *fetch.Fetch) {
	// 如果需要,在重试前修改请求
	nf.SetHeader("X-Retry-Count", "1")
})

自定义重试逻辑(指数退避)

go
package main

import (
	"fmt"
	"time"
	"github.com/go-zoox/fetch"
)

func fetchWithRetry(url string, maxRetries int) (*fetch.Response, error) {
	var lastErr error
	
	for i := 0; i < maxRetries; i++ {
		response, err := fetch.Get(url)
		if err == nil && response.Ok() {
			return response, nil
		}
		
		lastErr = err
		if i < maxRetries-1 {
			// 指数退避:1s, 2s, 4s...
			backoff := time.Second * time.Duration(1<<uint(i))
			time.Sleep(backoff)
		}
	}
	
	return nil, fmt.Errorf("在 %d 次重试后失败: %w", maxRetries, lastErr)
}

func main() {
	response, err := fetchWithRetry("https://httpbin.zcorky.com/get", 3)
	if err != nil {
		panic(err)
	}
	
	fmt.Println(response.JSON())
}