Это история моего опыта написания API-клиента на Go (golang), для извлечения изображений из unsplash api.

Что такое Unsplash

Постоянно растущая коллекция бесплатных фотографий высокого качества и высокого разрешения, делайте все, что хотите. Я люблю использовать фотографии и иногда вносить свой вклад.



Итак, что мы строим?

Цель состоит в том, чтобы создать библиотеку golang, которую можно импортировать в любой проект. Вы предоставите ему некоторые учетные данные, а затем сможете искать их коллекцию фотографий по запросу.

Сначала несколько ссылок, чтобы нас заземлить:

Новый проект

Убедитесь, что у вас установлен 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 в типизированный формат, который мы объявили в наших определениях структур.

После этого я немного передвинул вещи, чтобы сделать их более похожими на библиотеку. Вложенные вещи под Клиентом, которые можно обновить.

и вуаля https://github.com/drKnoxy/unsplash-go