Изучаем Go – Продолжаем работать с REST API
Продолжаем приключения
В прошлый раз мы сделали небольшую программу для запроса REST API и вывода ответа. И это было пусть и не самым полезным, но хорошим опытом. В это раз мы попробуем сделать с программой что-нибудь такое, что можно встретить на практике - надеюсь, я выясню что, прежде, чем мы доберемся до конца поста.
Ответ JSON
Чтобы использовать ответ от httpbin.org в JSON формате, нам нужно получить данные из JSON и перевести его в структуру, с которой может работать Go. На примере из предыдущего поста, воспользуемся простейшим способом и создадим структуру struct на сайте JSON-to-Go.
Вот наш исходный объект...
{
  "args": {},
  "headers": {
    "Accept-Encoding": "gzip",
    "Connection": "close",
    "Host": "httpbin.org",
    "User-Agent": "Go-http-client/1.1"
  },
  "origin": "68.211.xx.xx",
  "url": "https://httpbin.org/get"
}
А вот автосгенерированный результат…
type AutoGenerated struct {
  Args struct {
  } `json:"args"`
  Headers struct {
    AcceptEncoding string `json:"Accept-Encoding"`
    Connection     string `json:"Connection"`
    Host           string `json:"Host"`
    UserAgent      string `json:"User-Agent"`
  } `json:"headers"`
  Origin string `json:"origin"`
  URL    string `json:"url"`
}
Видите, перевод довольно хорош, но по сути нам даже не нужно в точности то, что предлагает JSON-to-Go. Мы собираемся немного изменить секции Args и Header, превратив их в карту map.
type HTTPBinResponse struct {
  Args    map[string]string `json:"args"`
  Headers map[string]string `json:"headers"`
  Origin  string            `json:"origin"`
  URL     string            `json:"url"`
}
Структура Map в основном представляет из себя пару ключ / значение, которая идеально подходит для хранения параметров запроса и заголовков. Это делает нашу структуру немного проще в использовании и теперь мы с легкостью можем перебирать при желании Args или Headers.
Мы внесли немного изменений в наш код, так что хочу подвести итог. Во-первых, мы обновили URL-адрес, который вызываем, чтобы включить два параметра запроса. Благодаря этому мы можем использовать нашу новую карту Args.
APIURL := "https://httpbin.org/get?arg1=one&arg2=two"
А сейчас займемся нашим полученным ответом: мы создаем новую переменную r типа HTTPBinResponse. Она содержит структуру, необходимую для ответа. Затем мы используем json.Unmarshal для «демаршализации» объекта JSON в нашу структуру.
var r HTTPBinResponse json.Unmarshal(body, &r)
В этом случае, если все, что слева верно, мы выводим данные. Вывод осуществим несколькими способами: сперва указываем полную структуру и User Agent, а потом, наконец, второй аргумент. На практике вы можете точно и не знать, какие заголовки (кроме стандартных HTTP-заголовков) или аргументы возвращаются, сейчас используем это в качестве примера.
  fmt.Printf("%#v\n\n", r)
  fmt.Printf("%v\n\n", r.Headers["User-Agent"])
  fmt.Printf("%v\n", r.Args["arg2"])
Другие статьи из цикла:
- Изучаем Go - создание загрузчика (часть 1)
 - Изучаем Go - создание загрузчика (часть 2)
 - Изучаем Go - создание загрузчика (часть 3)
 - Изучаем Go - создание загрузчика (часть 4)
 - Изучаем Go - создание загрузчика (часть 5)
 - Изучаем Go - Использование REST API
 - Изучаем Go - Продолжаем работать с REST API
 - Изучаем Go - Отправка REST-запросов
 - Изучаем Go - Используем REST API в паре с шаблонами проектирования
 - Изучаем Go - Повторная отправка электронной почты через API
 Изучаем Go - Давайте станем модульными!скороИзучаем Go - Давайте станем модульными снова!скороИзучаем Go - Сборка DevLog Часть 01скороИзучаем Go - Сборка DevLog Часть 02скоро