Сегодняшний криптографический ландшафт может быть устрашающим. По мере роста бирж и токенов отслеживание рыночных данных становится сизифовой задачей.
В следующих разделах дается простое руководство по созданию API, который предоставляет данные о ценах для вашего приложения с поддержкой шифрования.
Номинальные и рыночные данные
Чтобы точно знать рыночную цену в любой момент времени, необходимо использовать несколько десятков API-интерфейсов обмена и произвести несколько умных расчетов.
К счастью, уже существует бесплатный сервис, который сделал всю работу за вас.
Познакомьтесь с Nomics, API данных криптовалюты, которому доверяют здесь, в TokenSoft. Настолько, что на самом деле мы стали инвестором в 2018 году.
Nomics поддерживает актуальность цен, пересчитывая каждые 10 секунд и взвешивая 24-часовые объемы на ведущих биржах. Для особо любопытных ознакомьтесь с подробным объяснением методологии ценообразования Nomic.
Вот что мы расскажем
- Настройка сервера GraphQL с помощью Node.js и NPM
- Получение бесплатного ключа Nomics API
- Получение данных о ценах (в долларах США) из Nomics API и кеширование результатов
- Предоставление конечной точки GraphQL для запроса данных о ценах
Предпосылки
На вашем компьютере должны быть установлены Node.js и NPM. Предполагается общий опыт работы с JavaScript.
Полный исходный код этого примера можно найти здесь.
1. Настройка сервера GraphQL
Структура проекта
Откройте свой терминал и запустите приведенный ниже фрагмент, чтобы построить структуру своего проекта.
$ mkdir -p crypto-pricefeed/src && cd crypto-pricefeed && touch src/index.js && touch src/NomicsConnector.js && npm init
(следуйте подсказкам командной строки, чтобы настроить файл package.json
)
Установка зависимостей
Чтобы быстро приступить к работе, мы воспользуемся несколькими инструментами, чтобы быстро начать разработку. Они включают следующее.
- Axios, HTTP-клиент на основе обещаний для браузера и Node.js
- Рюкзак, минималистичная система сборки Node.js
- Memoizee, полное решение для мемоизирования / кеширования для JavaScript
- Graphql-yoga, полнофункциональный сервер GraphQL с упором на простую настройку
Установите их с помощью NPM.
$ npm install axios backpack-core memoizee graphql-yoga
Настройка скриптов NPM
Откройте проект в предпочитаемом вами редакторе и добавьте следующие записи сценариев в ваш package.json
файл.
{ "name": "crypto-pricefeed", "version": "1.0.0", "description": "", "scripts": { "dev": "backpack dev", "build": "backpack build", "start": "node ./build/main.js" } }
Вы сможете использовать их для запуска сервера из командной строки.
Запуск сервера
В src/index.js
импортируйте шаблонный сервер из graphql-yoga
и вставьте определения типов и преобразователи в конечную точку exchangeRate.
Мы будем использовать игровой интерфейс GraphQL Yoga для тестирования нашего API.
import { GraphQLServer } from 'graphql-yoga' const typeDefs = ` type Query { exchangeRate(currency: String!): Float } ` const resolvers = { Query: { exchangeRate: (root, variables, context) => { return 9000.01 } } } const server = new GraphQLServer({ typeDefs, resolvers }) // Go to http://localhost:4000 to test your API server.start(() => console.log('Server running on :4000'))
В терминале запустите:
$ npm run dev
Теперь посетите http: // localhost: 4000 / в браузере.
Давайте протестируем нашу конечную точку exchangeRate в пользовательском интерфейсе игровой площадки.
2. Получение бесплатного ключа API Nomics
Перейдите на страницу цен Nomics и выберите их уровень бесплатного пользования.
Заполните и отправьте регистрационную форму.
Вскоре вы получите электронное письмо с вашим ключом API!
3. Получение данных о ценах из Nomics API
Класс разъема
В src/NomicsConnector.js
импортируйте axios
и напишите начальный класс коннектора, который устанавливает экземпляр клиента HTTP и метод получения цен.
import axios from 'axios' class NomicsConnector { constructor (apiKey) { this.client = axios.create({ baseURL: 'https://api.nomics.com/v1', method: 'get', responseType: 'json', params: { key: apiKey } } } async getPrices () { const res = await this.client('/prices') return res.data } } export default NomicsConnector
Форма ценовых данных
Nomics возвращает все данные о своих ценах (выраженные в долларах США) в виде списка, подобного этому.
[ {"currency":"0XBTC","price":"0.27487"}, {"currency":"1ST","price":"0.03332"}, {"currency":"2GIVE","price":"0.00179"}, {"currency":"ABA","price":"0.02436"}, {"currency":"ABL","price":"0.00731"}, {"currency":"ABS","price":"0.00650"}, {"currency":"ABT","price":"0.08112"}, {"currency":"ABTC","price":"0.14410"}, /* ... */ ]
Посмотрите сами на https://api.nomics.com/v1/prices?key=YOUR_API_KEY.
Цены по валюте
Давайте добавим к нашему коннектору функцию, которая принимает данные о ценах и связывает цены по символу валюты.
/* ... */ async getPricesByCurrency () { const prices = await this.getPrices() return prices.reduce( (pricesByCurrency, { currency, price }) => { pricesByCurrency[currency] = price return pricesByCurrency }, {} ) } } export default NomicsConnector
Теперь мы можем написать функцию, которая принимает символ валюты и возвращает цену этой валюты.
/* ... */ async getPrice (currency) { const pricesByCurrency = await this.getPricesByCurrency() return pricesByCurrency[currency] } } export default NomicsConnector
Кеширование ценовых данных с помощью Memoizee
Держать на секунду! Каждый раз, когда мы вызываем getPrice
, мы будем делать HTTP-запрос к Nomics API и уменьшать результат, чтобы мы могли найти одну пару "ключ-значение".
Давайте возьмем нашу getPricesByCurrency
функцию и кэшируем результат с memoizee
в функции-конструкторе.
import axios from 'axios' import memoize from 'memoizee' class NomicsConnector { constructor (apiKey) { this.client = axios.create({ baseURL: 'https://api.nomics.com/v1', method: 'get', responseType: 'json', params: { key: apiKey } } this.getPricesByCurrencyCached = memoize( this.getPricesByCurrency, { maxAge: 300000, // 5 minutes til cache expiration preFetch: 0.05, // pre-fetch 15s before expiration promise: 'then' // handle async } ) } /* ... */
Наконец, обновите функцию getPrice
для поиска наших кэшированных данных.
/* ... */ async getPrice (currency) { const pricesByCurrency = await this.getPricesByCurrencyCached() return pricesByCurrency[currency] } } export default NomicsConnector
4. Открытие конечной точки GraphQL
Использование NomicsConnector
Вернемся к src/index.js
, давайте импортируем наш класс NomicsConnector и сохраним наш ключ API в качестве переменной.
import { GraphQLServer } from 'graphql-yoga' import NomicsConnector from './NomicsConnector' const NOMICS_API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' /* ... */
Когда мы вызываем конструктор нашего сервера, укажите экземпляр класса NomicsConnector в context
option GraphQL.
/* ... */ const server = new GraphQLServer({ typeDefs, resolvers, context: { nomics: new NomicsConnector(NOMICS_API_KEY) } }) // Go to http://localhost:4000 to test your API server.start(() => console.log('Server running on :4000'))
Заключение
Измените преобразователь, чтобы использовать наш экземпляр NomicsConnector и получить кешированную цену валюты.
const resolvers = { Query: { exchangeRate: (root, variables, context) => context.nomics.getPrice(variables.currency) } }
Последние мысли
Если вы зашли так далеко, поздравляем!
Мы рассмотрели настройку сервера GraphQL с кэшированной конечной точкой обменного курса.
Следующие шаги могут включать поддержку фиатных пар, отличных от долларов США.
Кроме того, конечная точка панели инструментов Nomics - отличное место для расширения вашего API для поддержки таких показателей, как 24-часовой объем или движение цен.
Весь исходный код для приведенного выше примера можно найти здесь.
Если вы заинтересованы в работе с или в TokenSoft Inc, не стесняйтесь обращаться к нам.