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