Как использовать Rails API с внешним API

В рамках четвертой фазы буткемпа Flatiron School по разработке программного обеспечения нам предстоит создать полнофункциональное приложение, включая создание API в Rails для взаимодействия с клиентским приложением React.

До этого момента большинство наших тестовых данных использовалось либо с помощью Faker для генерации данных seed, либо путем создания нашего файла seed с нуля.

Но, как вы можете себе представить, обе эти стратегии имеют свои недостатки.

При использовании Faker качество тестовых данных ограничено возможностями исходных данных Faker или настройкой ваших собственных данных Faker.

Создание исходных данных может стать утомительным занятием, и ваши тесты еще больше искажаются из-за того, что вы сами создаете тестовые данные, которые тестируете.

Но что, если я скажу вам, что вы можете использовать внешний API для создания исходных данных?

Есть несколько других сервисов, но я использовал RapidAPI и, в частности, RAWG API, который имеет тонну API для использования.

Обещаю, это не так сложно и будет весело!

Предположения

1) У вас есть учетная запись RapidAPI и RAWG API
2) Вы используете Ruby on Rails и используете как минимум версию 2.7.4
3) Вы знакомы с Ruby on Rails, Ruby Gems, и migrating и seeding Rails API.
4) Вы владеете концепциями HTTP/REST.

Кроме того, я использовал API RAWG, поэтому я покажу шаги, которые я использовал для этого API; однако, другие API могут иметь другие инструкции и шаги. Я настоятельно рекомендую прочитать документацию по конкретному API, который вы используете, так как они могут рекомендовать другой процесс.

Шаг 1: Получение ключа API и конечной точки API

Сначала я зарегистрировал бесплатный аккаунт в RapidAPI, а затем в RAWG. Это позволило мне получить API-ключ, который необходим для доступа к их API.

(Если вы не знаете, что такое API-ключ, я бы рекомендовал прочитать эту статью для краткого обзора).

На сайте RAWG я попал на домашнюю страницу API, где была большая жирная кнопка «GET API KEY».

Вам может понадобиться ввести некоторую базовую информацию о том, почему вы используете API, и указать URL (я указал наш репозиторий на GitHub).

После выполнения всех этих административных задач перед вами должна открыться следующая страница (я зачернил свой личный ключ и информацию по понятным причинам):

Скопируйте значение в поле «API Key» и сохраните его в безопасном месте. Не сообщайте его никому. Это ключ, который ваше приложение будет использовать для запроса данных из внешнего API.

Шаг 2: Получите конечную точку API

Далее вам нужно получить конечную точку API. Здесь все зависит от RAWG, но RAWG предоставляет вам свою конечную точку прямо на домашней странице RAWGAPI:

Сохраните эту конечную точку, поскольку вы будете делать GET запрос к этому URL.

Шаг 3: Установите Gems

Вам необходимо установить следующие гемы:

1) gem rest-client
2) gem dotenv-rails.

Шаг 4: Создайте ENV и обновите файл .gitignore

Есть несколько быстрых шагов, которые мы должны предпринять, чтобы позволить нашему коду использовать API.

1) Создайте файл ENV

Вам нужно будет создать файл .env, создать переменную и присвоить ей ключ API:

//.env file
API_KEY = <paste your api key here>
Войти в полноэкранный режим Выйти из полноэкранного режима

2) Обновите файл .gitignore

Вам нужно добавить следующий код в ваш файл .gitignore. Этот файл указывает GitHub, какие файлы следует «игнорировать» при отслеживании и размещении файлов в репозитории. Как вы понимаете, мы не хотим передавать наш API-ключ в интернет, поэтому это обеспечит нам небольшую безопасность при размещении нашего кода.

//.gitignore file
.env
Вход в полноэкранный режим Выйдите из полноэкранного режима

После выполнения этих двух шагов мы готовы обновить наш файл seeds!

Шаг 5: Создайте файл семян!

В свой файл seeds вставьте следующий код:

1 require 'rest-client'
2
3 puts "Getting Games Data"
4   def api_key
5        ENV["API_KEY"]
6    end
7
8    def games_dataset
9        api_data = { key: api_key }
10        games = RestClient.get("https://api.rawg.io/api/games?key=#{api_data[:key]}")
11        games_array = JSON.parse(games)["results"]
12        games_array.each do |g|
13            Game.create(
14                title: g["name"],
15                genre: g["genres"][0]["name"],
16                platform: g["platforms"][0]["platform"]["name"],
17                image: g["background_image"]
18            )
19        end
20
21
22    end
23 games_dataset() 
24 puts "Seeding Games Data"
Войти в полноэкранный режим Выйти из полноэкранного режима

Позвольте мне разбить этот код на строки.

— СТРОКА 1: Мне требуется гем rest-client. В двух словах, этот гем дает нам доступ к простым действиям HTTP/REST, таким как GET, который позволяет нам получать данные из RAWG API.

— LINE 3: Далее я добавил простой puts в консоль, чтобы сообщить нам, что происходит (всегда полезная практика!).

— LINE 4-6: Далее, у меня есть метод (api_key), который получает мою переменную API_KEY из моего файла ENV.

— 8-Я СТРОКА: Затем, самое важное, мой метод games_dataset ….. Вот что происходит сверху вниз:

— СТРОКА 9: Я создаю переменную и устанавливаю ее в объект с key в качестве ключа и моим api ключом в качестве значения.

— СТРОКА 10: Я создаю переменную и устанавливаю ее равной методу, RestClient.get, который является методом, предоставленным мне гемом rest-client, который является получением конечной точки API.

— 11-Я СТРОКА: Я создаю еще одну переменную и использую метод JSON.parse(). Этот метод Ruby превращает массив JSON в массив Ruby.

— LINE 12 — 19: Затем я использую метод .each для итерации данных и метод .create для занесения данных в соответствующие атрибуты, которые мне нужны в моей игровой модели.

— Строка 23: Затем я вызываю свой метод games_dataset(), чтобы этот метод выполнялся, когда я запускаю rails db:seed, а также выводит-вывод в консоль, чтобы я знал, когда мои данные закончат засев.

Я бы настоятельно рекомендовал вводить byebug везде во время этого процесса, особенно чтобы убедиться, что вы пингуете API и успешно получаете данные в ответ, а также при итерации JSON-данных для засева вашей модели.

Продолжайте тестирование, запуская rails db:seed, чтобы убедиться, что ваши данные попадают в базу данных.

Шаг 6: Вскиньте руки вверх и крикните «Я непобедим!».

…Потому что вы только что засеяли базу данных другим API!

Больше никаких Lorem Ipsum’ов и стоковых фотографий кошек от Faker’а, и никаких копи-пастов, засеивающих данные.

Бонусный шаг: При развертывании на Heroku

При развертывании на Heroku я столкнулся с проблемой при попытке посева данных в Heroku (heroku run rails db:seed).

Я получал ошибку RestClient::Unauthorized: 401 Unauthorized.

После некоторого поиска неисправностей (и помощи одного из наших замечательных инструкторов по FI), проблема заключалась в том, что Heroku пытался посеять данные из RAWG, но не использовал мой API_KEY.

Мой API_KEY хранился в моем файле .env, который игнорировался в моем файле .gitignore.

Это вызвало проблему, потому что Heroku принимает ваш последний push в вашу main ветку на GitHub.

Поскольку файл .gitignore игнорируется при публикации на GitHub, Heroku не получал мой API_KEY для использования при пинге RAWG.

FIX:

При первом развертывании на Heroku вам нужно настроить Heroku на установку переменной окружения для вашего API_KEY, подобно тому, как это делал файл .env.

Шаги в этом замечательном руководстве по Heroku должны вам помочь!


Заключение

Хотя это, очевидно, относится к RapidAPI и конкретно к RAWG API, общая концепция должна оставаться такой же для любого внешнего API, который вы можете использовать.

Вкратце, мы делаем следующее:

  1. Используем ключ API и конечную точку для получения данных из внешнего API
  2. Итерация этих данных и подстановка значений в атрибуты нашей модели.

Хотя конечная точка и ключ могут отличаться для различных API, которые вы можете использовать, это основная идея того, что мы делаем.

Очевидно, существуют и другие способы сделать это в зависимости от используемых вами языков, но основная концепция «эй, дайте мне данные!» остается неизменной.

Я надеюсь, что это руководство было полезным, и из этих семян вы сможете вырастить сильное дерево база данных.

Оцените статью
devanswers.ru
Добавить комментарий