В рамках четвертой фазы буткемпа Flatiron School по разработке программного обеспечения нам предстоит создать полнофункциональное приложение, включая создание API в Rails для взаимодействия с клиентским приложением React.
До этого момента большинство наших тестовых данных использовалось либо с помощью Faker для генерации данных seed
, либо путем создания нашего файла seed
с нуля.
Но, как вы можете себе представить, обе эти стратегии имеют свои недостатки.
При использовании Faker качество тестовых данных ограничено возможностями исходных данных Faker или настройкой ваших собственных данных Faker.
Создание исходных данных может стать утомительным занятием, и ваши тесты еще больше искажаются из-за того, что вы сами создаете тестовые данные, которые тестируете.
Но что, если я скажу вам, что вы можете использовать внешний API для создания исходных данных?
Есть несколько других сервисов, но я использовал RapidAPI и, в частности, RAWG API, который имеет тонну API для использования.
Обещаю, это не так сложно и будет весело!
- Предположения
- Шаг 1: Получение ключа API и конечной точки API
- Шаг 2: Получите конечную точку API
- Шаг 3: Установите Gems
- Шаг 4: Создайте ENV и обновите файл .gitignore
- 1) Создайте файл ENV
- 2) Обновите файл .gitignore
- Шаг 5: Создайте файл семян!
- Шаг 6: Вскиньте руки вверх и крикните «Я непобедим!».
- Бонусный шаг: При развертывании на Heroku
- Заключение
Предположения
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, который вы можете использовать.
Вкратце, мы делаем следующее:
- Используем ключ API и конечную точку для получения данных из внешнего API
- Итерация этих данных и подстановка значений в атрибуты нашей модели.
Хотя конечная точка и ключ могут отличаться для различных API, которые вы можете использовать, это основная идея того, что мы делаем.
Очевидно, существуют и другие способы сделать это в зависимости от используемых вами языков, но основная концепция «эй, дайте мне данные!» остается неизменной.
Я надеюсь, что это руководство было полезным, и из этих семян вы сможете вырастить сильное дерево база данных.