Я не буду первым, кто скажет тебе это
- Я ненавижу REST API
- Мне нравится GraphQL
Итак, сегодня я собираюсь показать вам, как вы можете быть ботаником по географии и создать сервер GraphQL, который запрашивает http://www.geonames.org/ , географическая база данных, содержащая информацию обо всех странах и столицах.
Если в начальной школе вы испытываете ностальгию по этим географическим пчелам, позвольте мне провести вас по переулку памяти.
Перво-наперво,
Настройка проекта (раздражает)
mkdir DopeGraphQLServer cd DopeGraphQLServer npm init
Для краткости, позвольте мне опубликовать свой package.json
Независимо от проекта, я всегда нахожу время, чтобы настроить ESLint для линтинга и Flow для проверки типов.
Давайте загрузим эти файлы конфигурации:
Хорошо, поскольку мы не живем в каменном веке, нам нужно сделать некоторую конфигурацию Babel.
3. .babelrc
Ладно, пока не утомляйся. Всего 2 конфига
4. .gitignore
5. .npmignore
Блин, а теперь сохраните эти конфиги где-нибудь, чтобы больше никогда не приходилось так делать.
Давайте создадим сервер GraphQL
Сайке! Мы просто собираемся опираться на мой любимый сервер GraphQL, Сервер Apollo!
Для создания нашего сервера GraphQL нам понадобится пара инструментов.
Express и apolloExpress - мы будем использовать Express в качестве нашего веб-сервера и apolloExpress для управления нашими потребностями GraphQL.
graphiqlExpress - https://github.com/graphql/graphiql Мы будем использовать это для самоанализа. Безусловно, лучший способ создавать и экспериментировать с API.
apolloExpress требует, чтобы мы определили схему, поэтому мы пока вставим ее. Обратите внимание: если вы попытаетесь запустить свой код после этого момента, ничего не получится. Так что наберитесь терпения :)
Вот сервер:
Как вы можете видеть выше, наш сервер будет обслуживать наши запросы по маршруту / graphql, а в процессе разработки у нас будет доступ к нашему инструменту самоанализа по адресу / graphiql.
Схема времени
В GraphQL «схема» представляет определенный набор данных, которые поддерживает сервер. Это одна из лучших особенностей GraphQL, схемы, обеспечиваемой системой типов. Таким образом, у ваших клиентов всегда будет гарантия на данные в определенном формате.
Давайте определим нашу схему:
Теперь у нас есть схема для информации о нашей стране.
Хорошо, теперь нам нужно «разрешить» эти данные.
Прежде чем мы перейдем к этому, давайте определим корневую схему. Возможно, вас немного смущает следующий раздел, но не волнуйтесь, мальчик здесь для вас.
Итак, мы импортируем countrySchema, которую создали, чтобы определить тип возвращаемого значения наших «преобразователей». Мы еще не углубились в резолверы, так что давайте сделаем это сейчас.
В GraphQL каждый запрос к серверу возвращает данные запрашивающим их клиентам. Интерфейс для запроса этих данных осуществляется с помощью запроса. Но мы делаем запросы с помощью концепции, называемой «резолверы».
Резольверы - это просто функции. Шутки в сторону.
Это просто функции, которые принимают запрос и возвращают данные на основе указанной схемы GraphQL. В нашем случае мы напишем преобразователь под названием «allCountries», который будет возвращать массив типов Country.
Самое прекрасное в GraphQL - это возможность принудительно назначать входные данные этих преобразователей определенному типу. Мы поговорим об этом немного позже, когда начнем делать динамические запросы, но пока мы просим все, и нам гарантируется, что сервер вернет эти данные на основе предоставленной схемы.
Цитата Йонаса Хелфера на секунду
До версии 0.7 не было официальных рекомендаций, как назвать корневые типы, поэтому люди выбирали разные альтернативы: Query, RootQuery, QueryRootType и т. Д. GraphQL.js 0.7 здесь более категоричен; он предпочитает: Запрос, Мутация и Подписка.
Итак, выше мы определяем наш корневой запрос, обозначенный как «Запрос».
Теперь мы собираемся сформировать наш запрос корневого типа.
Вот наша rootSchema. Пакет graphql-tools позволяет создавать схему GraphQL с помощью функции makeExecutableSchema. Требуется два обязательных свойства: typeDefs и преобразователи. Мы добавили параметр logger для регистрации ошибок в разработке.
В настоящее время наши преобразователи пусты, но мы собираемся решить это сейчас. Ха-ха, каламбуры.
Время резолвера
Итак, этот объект наших преобразователей, представляющий наш преобразователь, allCountries. Как я сказал ранее, allCountries - это просто функция, которая будет возвращать наши данные при GraphQL.
Теперь нам нужно написать эту функцию. Пришло время представить нашу окончательную концепцию.
Разъемы
Коннектор - это фрагмент кода, который связывает сервер GraphQL с конкретным сервером. В нашем случае бэкэнд здесь - API GeoNames.
Мы собираемся попасть в API geoNames с обещанием запроса. Боковое примечание, обещание запроса благословлено. Обожаю эту библиотеку.
Вернемся к нашим резольверам и подключим эту функцию. Ха-ха, еще каламбур.
Затем давайте объединим это с нашими резолверами.
Мне, вероятно, следует проверить, работает ли весь этот код. BRB.
Хорошо, мы расслабляемся.
Откройте localhost: 8000 / graphiql. Давайте попробуем.

Как видите, мы набираем наш запрос в GraphiQL. Посмотрим ответ. Надеюсь, это сработает.

ОХХХ ДА. ПОСМОТРИТЕ НА ЭТУ СЛАВУ. Мы сделали это.
Теперь у нас есть список всех стран и данные, основанные на нашей схеме страны.
Хорошо, это сообщение в блоге становится длинным, но

Давайте добавим еще резолверы. Давайте возьмем страну по коду страны и вернем одну страну.

Теперь мы можем искать данные о стране по коду страны. Довольно аккуратно, правда?
Теперь я уверен, что с этим API мы можем сделать больше, поэтому прошу вас клонировать это репо и проверить его!
Заключение
Что ж, это было весело, и я надеюсь, что это было отличное введение в простую альтернативу Rest API. Мы рассмотрели элементы, необходимые для начала работы с GraphQL, и создали отличный небольшой источник данных.
Что дальше?
Давайте добавим PR к этому репо, расширим возможности поиска, а затем подключим к нему пользовательский интерфейс. Я, вероятно, буду использовать это репо для дальнейших публикаций, так что в конце концов у нас будет сумасшедшее количество решателей. Как только мы подключим кучу вещей, мы рассмотрим варианты хостинга.
Напишите в Твиттере еще несколько идей по источникам данных здесь!
Чао.