Result
Result инкапсулирует HTTP-ответ и метаданные запроса, предоставляя удобные методы доступа. Получается через Client.Request() или функции пакета.
type Result struct {
Request *RequestInfo
Response *ResponseInfo
Meta *RequestMeta
}result, err := httpc.Get("https://api.example.com/users/1")
if err != nil {
log.Fatal(err)
}
fmt.Println(result.StatusCode()) // 200
fmt.Println(result.Body()) // {"id":1,"name":"test"}TIP
Result создаётся заново для каждого запроса и автоматически утилизируется GC, ручное освобождение не требуется.
Базовые методы
StatusCode
func (r *Result) StatusCode() intВозвращает HTTP-код состояния. Безопасен для nil, возвращает 0.
Body
func (r *Result) Body() stringВозвращает тело ответа как строку. Безопасен для nil, возвращает пустую строку.
RawBody
func (r *Result) RawBody() []byteВозвращает тело ответа как исходные байты. Безопасен для nil, возвращает nil.
Proto
func (r *Result) Proto() stringВозвращает версию HTTP-протокола, например "HTTP/1.1", "HTTP/2.0".
Проверка состояния
IsSuccess
func (r *Result) IsSuccess() boolВозвращает true для кодов состояния 2xx.
IsRedirect
func (r *Result) IsRedirect() boolВозвращает true для кодов состояния 3xx.
IsClientError
func (r *Result) IsClientError() boolВозвращает true для кодов состояния 4xx.
IsServerError
func (r *Result) IsServerError() boolВозвращает true для кодов состояния 5xx.
result, _ := client.Get(url)
switch {
case result.IsSuccess():
handleSuccess(result)
case result.IsClientError():
handleClientError(result)
case result.IsServerError():
handleServerError(result)
}Методы Cookie
ResponseCookies
func (r *Result) ResponseCookies() []*http.CookieВозвращает все Cookie из ответа.
GetCookie
func (r *Result) GetCookie(name string) *http.CookieПолучает Cookie ответа по имени, возвращает nil если не найден.
cookie := result.GetCookie("session")
if cookie != nil {
fmt.Println(cookie.Value)
}HasCookie
func (r *Result) HasCookie(name string) boolПроверяет наличие Cookie с указанным именем в ответе.
RequestCookies
func (r *Result) RequestCookies() []*http.CookieВозвращает все Cookie, отправленные в запросе.
GetRequestCookie
func (r *Result) GetRequestCookie(name string) *http.CookieПолучает Cookie запроса по имени.
HasRequestCookie
func (r *Result) HasRequestCookie(name string) boolПроверяет наличие Cookie с указанным именем в запросе.
Парсинг JSON
Unmarshal
func (r *Result) Unmarshal(v any) errorРазбирает тело JSON-ответа в целевую переменную. Следует соглашениям json.Unmarshal.
| Ошибка | Условие возникновения |
|---|---|
ErrResponseBodyEmpty | Тело ответа пустое |
ErrResponseBodyTooLarge | Тело ответа превышает лимит парсинга JSON в 50MB |
var user User
if err := result.Unmarshal(&user); err != nil {
log.Fatal(err)
}
fmt.Println(user.Name)Сохранение в файл
SaveToFile
func (r *Result) SaveToFile(filePath string) errorСохраняет тело ответа в файл. Путь файла проходит проверку безопасности (защита от обхода пути, проверка символических ссылок, защита системных путей).
| Ошибка | Условие возникновения |
|---|---|
ErrResponseBodyEmpty | Тело ответа пустое |
result, _ := client.Get("https://example.com/data.csv")
if err := result.SaveToFile("/tmp/data.csv"); err != nil {
log.Fatal(err)
}Строковое представление
String
func (r *Result) String() stringВозвращает читаемое строковое представление. Конфиденциальные заголовки автоматически маскируются, тело ответа обрезается до 200 символов.
result, _ := client.Get(url)
fmt.Println(result.String())
// Result{Status: 200 200 OK, ContentLength: 1024, Duration: 125ms, Attempts: 1, ...}Подтипы
RequestInfo
type RequestInfo struct {
URL string
Method string
Headers http.Header
Cookies []*http.Cookie
}Детали запроса. Доступ через result.Request.
ResponseInfo
type ResponseInfo struct {
StatusCode int
Status string
Proto string
Headers http.Header
Body string
RawBody []byte
ContentLength int64
Cookies []*http.Cookie
}Данные ответа. Доступ через result.Response.
RequestMeta
type RequestMeta struct {
Duration time.Duration
Attempts int
RedirectChain []string
RedirectCount int
}Метаданные выполнения запроса. Доступ через result.Meta.
result, _ := client.Get(url)
fmt.Println(result.Meta.Duration) // 125ms
fmt.Println(result.Meta.Attempts) // 2 (1 повторная попытка)
fmt.Println(result.Meta.RedirectCount) // 1 (1 перенаправление)См. также
- Функции пакета - методы запросов, возвращающие Result
- Параметры запроса - настройка поведения запросов
- Загрузка файлов - тип результата загрузки DownloadResult