Изучаем 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скоро