Метод http.Request.Clone
Метод http.Request.Clone создает глубокую копию HTTP-запроса.
В первый параметр метод принимает контекст, который будет использован для нового запроса.
Метод возвращает новый экземпляр http.Request, который является копией исходного запроса,
но с новым контекстом. Клонирование полезно при необходимости многократной отправки
одного и того же запроса с разными параметрами или для безопасной модификации запроса
в разных горутинах.
Синтаксис
req.Clone(ctx)
Метод принимает контекст context.Context и возвращает новый запрос.
Если переданный контекст равен nil, используется контекст исходного запроса.
Пример
Давайте создадим запрос, клонируем его и изменим метод у клона:
package main
import (
"context"
"fmt"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://example.com", nil)
ctx := context.Background()
clonedReq := req.Clone(ctx)
clonedReq.Method = "POST"
fmt.Println("Original method:", req.Method)
fmt.Println("Cloned method:", clonedReq.Method)
}
Результат выполнения кода:
"Original method: GET"
"Cloned method: POST"
Пример
Давайте клонируем запрос с заголовками и проверим, что они были скопированы:
package main
import (
"context"
"fmt"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://example.com", nil)
req.Header.Set("Authorization", "Bearer token123")
req.Header.Set("Content-Type", "application/json")
ctx := context.Background()
clonedReq := req.Clone(ctx)
fmt.Println("Original headers:", req.Header)
fmt.Println("Cloned headers:", clonedReq.Header)
}
Результат выполнения кода:
"Original headers: map[Authorization:[Bearer token123] Content-Type:[application/json]]"
"Cloned headers: map[Authorization:[Bearer token123] Content-Type:[application/json]]"
Пример
Давайте покажем, что клон имеет независимые заголовки от оригинала:
package main
import (
"context"
"fmt"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://example.com", nil)
req.Header.Set("X-Custom", "value1")
ctx := context.Background()
clonedReq := req.Clone(ctx)
clonedReq.Header.Set("X-Custom", "value2")
fmt.Println("Original header:", req.Header.Get("X-Custom"))
fmt.Println("Cloned header:", clonedReq.Header.Get("X-Custom"))
}
Результат выполнения кода:
"Original header: value1"
"Cloned header: value2"
Смотрите также
-
метод
http.Request.WithContext,
который создает новый запрос с измененным контекстом -
функцию
http.NewRequest,
которая создает новый HTTP-запрос с указанными методом и URL -
метод
http.Request.ParseForm,
который парсит параметры формы из тела запроса -
метод
http.Request.Context,
который возвращает контекст текущего запроса