Chainlink Connect to API. Часть 6
Открываем index.js.
const { Requester, Validator } = require('@chainlink/external-adapter')
Обязательный пакет для подключения, он помогает отправлять запросы и обрабатывать их.
Дальше в customError вы можете настроить обработку пользовательских ошибок, но можно и оставить без изменений.
В customParams мы записываем все параметры, которые можно будет запрашивать в смарт контракте.
Например в шаблоне есть строка:
base: ['base', 'from', 'coin']
которую можно заменить на
city: ['city', 'town']
если мы хотим, например, запрашивать температуру в определенном городе. Тогда в смарт контракте потребуется прописать строку запроса:
req.add("city", "boston");
Так же тут можно указать необязательные параметры, которые, возможно, будут в API ссылке, как, например, тут:
https://api.openweathermap.org/data/2.5/weather?q=<CITY_NAME>&appid=<YOUR_API_KEY>
где weather - и есть endpoint.
Endpoint, грубо говоря, это некая точка запроса на стороне сервера, которая выдает определенные параметры. В случае с weather она может отдавать температуру в int, а, например, с storm - есть ли угроза торнадо в регионе в булевом значении.
Иногда эти endpoint нужны в ссылке API, а иногда можно обойтись и без них. Поэтому этот параметр не обязателен.
Далее идет функция создания запроса createRequest. И тут обратим внимание на код внутри:
const validator = new Validator(callback, input, customParams)
создает объект Валидатора, куда передается callback (об этом позже), input от пользователя в контракте, параметры, которые мы прописали выше.
const jobRunID = validator.validated.id
Здесь функция получает jobId. Если забыли, что это такое, то прочитайте посты выше.
const endpoint = validator.validated.data.endpoint || 'price'
еще раз проверяем endpoint и через символ "||" указываем значение по умолчанию,
const url = `https://min-api.cryptocompare.com/data/${endpoint}`
и передаем ссылку API.
const appid = prosess.anv.API_KEY;
Некоторые API для подключения требуют регистрации на сервисе и получения уникального ключа доступа API_KEY, его можно хранить, как переменную среды в файле .env.
В конце мы создаем переменную, куда помещаем данные о параметрах запроса, в нашем случае это city:
const cityData = validator.validated.data.city.toUpperCase()
Приведение к одному регистру нужно для дополнительной корректности передачи значений.
Далее в const params мы передаем cityData и appid.
Переменная const config будет работать типа axios, это такой способ передачи данный через url. И тут не нужно указывать дополнительные значения типа "get" или "headers".
После подготовки запроса мы создаем функции отправки запроса - Requester.request(), где в качестве аргументов передаются config и customErros.
response.data.result = Requester.validateResultNumber(response.data, ["path", "data"])
В этой строке особое внимание заслуживает ["path", "data"] - где определяется путь в json файле по ссылке до нужной нам информации. Например:
Из файла {"region": {"city":"boston"} - нужно будет передать ['region', 'city']
И затем вызывается callback функция:
callback(response.status, Requester.success(jobRunID, response))
В принципе, это все. Дальше код нам не интересен, так как он выполняет скорее служебные функции.
Как я уже говорил, после написания Адаптера, нам нужно подключить его к узлу, настроить Bridge и jobId, и запустить на нем Адаптер. После всех этих манипуляций вы можете написать смарт контракт, сделать деплой и запрашивать информацию с нужного API.
#chainlink #api #adapter
Post #287
131