DevGang
Авторизоваться

Изучаем 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"])

Другие статьи из цикла:

#Golang
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу