Это история моего опыта написания API-клиента на Go (golang), для извлечения изображений из unsplash api.
Что такое Unsplash
Постоянно растущая коллекция бесплатных фотографий высокого качества и высокого разрешения, делайте все, что хотите. Я люблю использовать фотографии и иногда вносить свой вклад.
Итак, что мы строим?
Цель состоит в том, чтобы создать библиотеку golang, которую можно импортировать в любой проект. Вы предоставите ему некоторые учетные данные, а затем сможете искать их коллекцию фотографий по запросу.
Сначала несколько ссылок, чтобы нас заземлить:
- Зарегистрируйтесь и получите идентификатор приложения и секрет: https://unsplash.com/oauth/applications
- Документация по API https://unsplash.com/documentation
Новый проект
Убедитесь, что у вас установлен go и относительно актуален. Если у вас не установлен go, попробуйте brew install go
Когда вы закончите, это должно работать:
$ go version > go version go1.7.1 darwin/amd64
Убедитесь, что ваш путь перехода настроен:
$ echo 'export GOPATH=$HOME/go' >> $HOME/.profile
$ source $HOME/.profile
$ go env | grep GOPATH
GOPATH="/Users/awknox/go"
Создайте новый проект:
$ mkdir -p ~/go/src/github.com/YOUR_USERNAME/unsplash-go
Создадим main.go
и начнем:
package main func main() { println("hello") }
Круто, теперь мы можем строить и запускать.
$ go build
$ ./unsplash-go
> hello
Нажатие на API
HTTP-библиотека довольно проста. Дайте методу GET URL-адрес и держитесь за своих лошадей. После этого мы читаем тело в стандартный вывод и убеждаемся, что закрываем ридер.
Когда мы собираем и запускаем, мы получаем дамп того, как будет выглядеть ответ json. Сохраните это в файл photos.json, и мы будем использовать его для создания структуры для моделирования ответа данных.
Я собираюсь получить общее количество страниц и общее количество страниц из объекта ответа, а затем я действительно возьму только URL-адреса идентификатора и изображения из ключа результата (хотя там есть куча).
Ключевое слово type
определяет новый тип, каждое поле имеет имя (Total, TotalPages), тип (строка) и тег, похожий на метаданные, чтобы помочь нам разобрать json.
Теперь, когда мы определили наши структуры, мы можем их заполнить.
Давайте быстро рефакторим этот поиск в отдельную функцию, а затем обсудим различные его части.
Теперь search
— это отдельная функция, которая принимает запрос и всегда возвращает PhotoResponse и ошибку. defer
в теле ответа говорит языку, что читатель должен быть закрыт, когда мы выходим из области действия этой функции. json.Decoder преобразует json в типизированный формат, который мы объявили в наших определениях структур.
После этого я немного передвинул вещи, чтобы сделать их более похожими на библиотеку. Вложенные вещи под Клиентом, которые можно обновить.