Краткое резюме: в этом руководстве мы будем использовать Webtask.io, чтобы показать, как вы можете создать свой собственный API перед любым дампом JSON из URL-адреса, который возвращает данные JSON. Честно говоря, мы можем добиться этого с любым бессерверным провайдером.

Введение

Согласно определению cloudflare, бессерверные вычисления - это метод предоставления серверных услуг на основе фактического использования. Бессерверный провайдер позволяет пользователям писать и развертывать код, не беспокоясь о базовой инфраструктуре.

Одна из возможностей того, что можно сделать с бессерверным интерфейсом, - это создание оболочек API. Доступных API-интерфейсов насчитывается до тысячи, даже если они еще обнаружены, но в большинстве случаев все, что мы хотим сделать, - это манипулировать или изменять данные, чтобы сделать их более подходящими для нашего использования посредством преобразования, манипуляции, сокращения, комбинирования или чего-то еще. Хотя это можно сделать на стороне клиента, это может быть намного эффективнее и быстрее на сервере. И если задуматься, кто хочет настраивать сервер только для изменения API, если вместо этого вы можете легко использовать бессерверную функцию?

Предпосылки

  1. Базовые знания NodeJS
  2. JavaScript (ECMAScript 2017)
  3. Базовые знания 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 готовыми к использованию.

Связанные ресурсы

  1. Webtask.io
  2. Бессерверные концепции
  3. Покемон данные JSON