cpp

Структура Response: ответ сервера

Структура Response из пакета net/http описывает ответ сервера на запрос. Объявление структуры:

// import "net/url"
type Response struct {
   Status     string
   StatusCode int
   Proto      string
   ProtoMajor int
   ProtoMinor int
   Header Header
   Body io.ReadCloser
   ContentLength int64
   TransferEncoding []string
   Close bool
   Uncompressed bool
   Trailer Header
   Request *Request
   TLS *tls.ConnectionState
}

Рассмотрим основные поля:

  • Status — код и текстовый статус ответа сервера:
fmt.Println("Status:", resp.Status)         // Status: 200 OK
  • StatusCode — код ответа сервера в виде числа:
fmt.Println("StatusCode:", resp.StatusCode) // StatusCode: 200
if resp.StatusCode >= 300 {
   fmt.Println("Статус:", resp.Status)
   return
}
  • Proto — название и версия протокола:
fmt.Println("Proto:", resp.Proto) // Proto: HTTP/1.1
  • ProtoMajor и ProtoMinor — отдельные составляющие версии протокола:
fmt.Println("ProtoMajor:", resp.ProtoMajor) // 1
fmt.Println("ProtoMinor:", resp.ProtoMinor) // 1
  • ContentLength — размер содержимого ответа в байтах. Если размер неизвестен, то содержит значение -1:
fmt.Println("ContentLength:", resp.ContentLength)
// ContentLength: 68
  • Body — позволяет получить содержимое ответа сервера:
body, err := io.ReadAll(resp.Body)
if err != nil {
   fmt.Println(err)
   return
}
fmt.Println(string(body))

После прочтения нужно закрыть поток:

defer resp.Body.Close()
  • Header — позволяет получить заголовки ответа сервера:
for k, v := range resp.Header {
   fmt.Println(k, "=>", v)
}
fmt.Println("Content-Type:", resp.Header.Get("Content-Type"))
// Content-Type: text/html; charset=UTF-8

Структура Response содержит следующие методы:

(*http.Response).Cookies() []*http.Cookie
(*http.Response).Location() (*url.URL, error)
(*http.Response).ProtoAtLeast(major int, minor int) bool
(*http.Response).Write(w io.Writer) error

Давайте изменим содержимое файла C:\xampp\htdocs\index.php следующим образом:

<?php
print_r($_GET);
?>

Теперь выполним запрос методом GET и обработаем результат, если код ответа сервера от 200 до 300 (не включая этот код) (листинг 19.7).

Листинг 19.7. Структура Response

package main

import (
   "fmt"
   "io"
   "net/http"
   "net/url"
)

func main() {
   m := url.Values{}
   m.Add("color1", "красный")
   m.Add("color2", "белый")
   u := "http://localhost/index.php?" + m.Encode()
   resp, err := http.Get(u)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer resp.Body.Close()
   if resp.StatusCode >= 300 {
      fmt.Println("Статус:", resp.Status)
      return
   }
   fmt.Println("Status:", resp.Status)
   fmt.Println("StatusCode:", resp.StatusCode)
   fmt.Println("Proto:", resp.Proto)
   fmt.Println("ProtoMajor:", resp.ProtoMajor)
   fmt.Println("ProtoMinor:", resp.ProtoMinor)
   fmt.Println("ContentLength:", resp.ContentLength)
   // Выводим заголовки ответа сервера
   for k, v := range resp.Header {
      fmt.Println(k, "=>", v)
   }
   fmt.Println("Content-Type:", resp.Header.Get("Content-Type"))
   // Выводим содержимое ответа сервера
   body, err := io.ReadAll(resp.Body)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(string(body))
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp