
Краткое резюме: в этом руководстве мы будем использовать Webtask.io, чтобы показать, как вы можете создать свой собственный API перед любым дампом JSON из URL-адреса, который возвращает данные JSON. Честно говоря, мы можем добиться этого с любым бессерверным провайдером.
Введение
Согласно определению cloudflare, бессерверные вычисления - это метод предоставления серверных услуг на основе фактического использования. Бессерверный провайдер позволяет пользователям писать и развертывать код, не беспокоясь о базовой инфраструктуре.
Одна из возможностей того, что можно сделать с бессерверным интерфейсом, - это создание оболочек API. Доступных API-интерфейсов насчитывается до тысячи, даже если они еще обнаружены, но в большинстве случаев все, что мы хотим сделать, - это манипулировать или изменять данные, чтобы сделать их более подходящими для нашего использования посредством преобразования, манипуляции, сокращения, комбинирования или чего-то еще. Хотя это можно сделать на стороне клиента, это может быть намного эффективнее и быстрее на сервере. И если задуматься, кто хочет настраивать сервер только для изменения API, если вместо этого вы можете легко использовать бессерверную функцию?
Предпосылки
- Базовые знания NodeJS
- JavaScript (ECMAScript 2017)
- Базовые знания API
Начиная
Для этого проекта мы будем использовать общеизвестные данные, мы будем использовать пакет данных Pokemon в формате JSON - https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json. Доступные данные в JSON насчитывают 151 различных персонажей покемонов. И для нашего первого кода мы напишем функцию, которая просто возвращает данные, а также объявляет кеш. Напоминаем, что serverless не имеет состояния, но большинство доступных бессерверных провайдеров могут сохранять вашу функцию активной в течение короткого периода времени. Таким образом, повторные вызовы в течение определенного периода времени могут использовать локально кэшированные значения для более быстрых результатов. Лучше!
let rp = require('request-promise');const JSON_URL = 'https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json';let cached; module.exports = async (context, callback) => { let data = await fetchData(); callback(null, { data }); }; async function fetchData() { if(cached) { console.log('currently using cache'); return cached; } else { return new Promise((resolve, reject) => { rp(JSON_URL) .then(res => { cached = JSON.parse(res).pokemon; resolve(cached); }); }); } }
Здесь мы просто вернули кеш или достигли URL-адреса и вернули его. Структура кода сразу дала нам некоторые преимущества. Если сервер, на котором размещены данные, работает медленно, наш кеш может с этим помочь. Если по какой-либо причине URL-адрес когда-либо исчезнет, или если они решат взимать плату за предоставленные данные, мы потенциально можем переключиться на другого поставщика, и пользователи этого никогда не заметят.
Чтобы сделать данные более чистыми, мы можем добавить фильтрацию. Мы фильтруем поля, которые будем использовать в проекте.
let rp = require('request-promise');const JSON_URL = 'https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json';let cached;module.exports = async (context, callback) => { let data = await fetchData(); // filter by name if(context.query.name) { console.log(`filter to name ${context.query.name}`); let sname = context.query.name.toLowerCase();data = data.filter(p => { let lastname = p.name.toLowerCase(); return lastname.indexOf(sname) >= 0; }); } // filter by type if(context.query.type) { let type = context.query.type.toLowerCase(); console.log(`filtering to type ${type}`);data = data.filter(p => { //write types to lowercase let types = p.type.join(',').toLowerCase().split(','); return types.indexOf(type) >= 0; }); } callback(null, { data }); }; async function fetchData() { if(cached) { console.log('currently using cache'); return cached; } else { return new Promise((resolve, reject) => { rp(JSON_URL) .then(res => { cached = JSON.parse(res).pokemon; resolve(cached); }); }); } }
Теперь мы добавили некоторые фильтры, имя и тип, используя строку запроса и объект Контекст, к которому имеют доступ все веб-задачи. Для каждого процесса фильтрации мы просто добавили простую фильтрацию на основе массива и изменили данные на нижний регистр, поэтому нам не нужно беспокоиться о совпадении регистра. Мы можем сделать столько доступных фильтров, сколько захотим. Они будут состоять из полей, которые вы сделаете доступными в своем API.
Вывод
Мы узнали, как настроить наши данные, возвращаемые с URL-адреса JSON, и фильтровать их, используя бессерверный режим. Это руководство не о создании API, но с данными, которые у нас есть в настоящее время, мы можем сделать наши собственные API готовыми к использованию.
Связанные ресурсы
- Webtask.io
- Бессерверные концепции
- Покемон данные JSON