РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1029 of 1593 menu

Метод http.Request.WithContext

Метод http.Request.WithContext создает новый экземпляр запроса, копируя все поля исходного запроса, но с указанным контекстом. В качестве параметра метод принимает новый контекст context.Context, который будет использован для управления временем выполнения запроса, отменой операций и передачей значений между компонентами приложения. Метод возвращает новый указатель на http.Request.

Синтаксис

req.WithContext(ctx)

Пример

Давайте создадим запрос с контекстом, который автоматически отменится через 5 секунд:

package main import ( "context" "fmt" "net/http" "time" ) func main() { req, err := http.NewRequest(http.MethodGet, "https://example.com", nil) if err != nil { fmt.Println(err) return } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() reqWithCtx := req.WithContext(ctx) fmt.Println(reqWithCtx.Context().Done()) }

Пример

Используем контекст для передачи пользовательских данных в запросе:

package main import ( "context" "fmt" "net/http" ) type userIDKey struct{} func main() { ctx := context.WithValue(context.Background(), userIDKey{}, "12345") req, err := http.NewRequest(http.MethodGet, "https://api.example.com/profile", nil) if err != nil { fmt.Println(err) return } reqWithCtx := req.WithContext(ctx) userID := reqWithCtx.Context().Value(userIDKey{}) fmt.Println(userID) }

Результат выполнения кода:

"12345"

Пример

Создаем запрос с контекстом и выполняем его, проверяя ошибку отмены:

package main import ( "context" "fmt" "net/http" "time" ) func main() { req, err := http.NewRequest(http.MethodGet, "https://example.com", nil) if err != nil { fmt.Println(err) return } ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() req = req.WithContext(ctx) client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println(err) return } defer resp.Body.Close() fmt.Println(resp.StatusCode) }

Результат выполнения кода при превышении таймаута:

context deadline exceeded

Смотрите также

  • метод http.Request.Context,
    который возвращает текущий контекст запроса
  • метод http.Request.Clone,
    который создает глубокую копию запроса с контекстом
  • функцию http.NewRequestWithContext,
    которая создает запрос с контекстом
  • функцию http.Client.Do,
    которая выполняет запрос с учетом контекста
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить