restler.io
Руководство по быстрому старту
restler.io — это простой инструмент, который позволяет легко создавать макеты API, генерировать пользовательские данные и выполнять операции с ними с использованием RESTful интерфейса. Он предназначен для использования в качестве инструмента прототипирования, тестирования и обучения.
Это руководство поможет вам начать работу с restler.io, создавая API для простого приложения Todo. Оно также рассмотрит некоторые ключевые концепции:
  • Проекты
  • Ресурсы
  • Генерация данных
  • Примеры кода
  • Фильтрация
  • Пагинация
  • Отношения между ресурсами
Проекты
Давайте добавим наш первый проект и назовем его "Приложение Todo".
Каждый проект получает свой уникальный базовый URL, который будут использовать все конечные точки в нем.
Ресурсы
Далее вам нужно будет добавить конечные точки в ваш проект. В restler.io это достигается путем создания Ресурса
Ресурс относится к определенной сущности данных, к которым можно получить доступ и манипулировать ими через API. Для нашего приложения Todo давайте назовем его "tasks". Добавьте поля "title" и "completed" в схему Ресурса. Будут сгенерированы следующие конечные точки:
Генерация данных
Для каждого поля в схеме Ресурса вы можете указать функцию-генератор Faker.js. Давайте обновим ресурс "tasks" со следующими генераторами:

- title -> lorem.sentences
- completed -> datatype.boolean

Теперь единственное, что осталось - это позволить restler.io сгенерировать данные для вас. На главном экране проекта наведите курсор на серый прямоугольник под названием "tasks" (вы должны увидеть всплывающую подсказку с количеством записей, которые будут сгенерированы) и нажмите на него!


Теперь единственное, что осталось - это позволить restler.io сгенерировать данные для вас. На главном экране проекта наведите курсор на серый прямоугольник под названием "tasks" (вы должны увидеть всплывающую подсказку с количеством записей, которые будут сгенерированы) и нажмите на него!


Примеры кода
Следующие примеры написаны на JavaScript. Пара вещей, которые стоит отметить:
1) restler.io ожидает заголовок content-type:application/json,
2) данные должны отправляться в виде JSON в теле запроса.
1. Получение задач:

fetch('https://PROJECT_TOKEN.restler.io/tasks', {
    method: 'GET',
    headers: {'content-type': 'application/json'},
}).then(res => {
    if (res.ok) {
        return res.json();
    }
// handle error
}).then(tasks => {
// Do something with the list of tasks
}).catch(error => {
// handle error
})
2. Создать новую задачу

const newTask = {
  content: 'Check out restler.io',
  completed: false,
};

fetch('https://PROJECT_TOKEN.restler.io/tasks', {
  method: 'POST',
  headers: {'content-type':'application/json'},
  // Send your data in the request body as JSON
  body: JSON.stringify(newTask)
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(task => {
  // do something with the new task
}).catch(error => {
  // handle error
})
3. Отметить задачи как выполненные

fetch('https://PROJECT_TOKEN.restler.io/tasks/1', {
  method: 'PUT', // or PATCH
  headers: {'content-type':'application/json'},
  body: JSON.stringify({completed: true})
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(task => {
  // Do something with updated task
}).catch(error => {
  // handle error
})
4. Удалить задачи

fetch('https://<PROJECT_TOKEN.restler.io/tasks/1', {
  method: 'DELETE',
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(task => {
  // Do something with deleted task
}).catch(error => {
  // handle error
})
Фильтрация
Предположим, мы хотим получить только невыполненные задачи. К счастью, restler.io поддерживает внешнюю фильтрацию (out of box) с помощью поисковых параметров:

const url = new URL('https://PROJECT_TOKEN.restler.io/tasks');
url.searchParams.append('completed', false); //https://PROJECT_TOKEN.restler.io/tasks?completed=false

fetch(url, {
  method: 'GET',
  headers: {'content-type':'application/json'},
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(tasks => {
  // restler returns only incomplete tasks
}).catch(error => {
  // handle error
})
Пагинация
Мы обычно не хотим видеть все задачи из базы данных, вместо этого давайте получим первые 10 и выполним пагинацию остальных. restler.io снова использует поисковые параметры для этого. Вот пример кода, чтобы получить первые 10 задач:


const url = new URL('https://PROJECT_TOKEN.restler.io/tasks');
url.searchParams.append('completed', false); //https://PROJECT_TOKEN.restler.io/tasks?completed=false
url.searchParams.append('page', 1); //https://PROJECT_TOKEN.restler.io/tasks?completed=false&page=1
url.searchParams.append('limit', 10); //https://PROJECT_TOKEN.restler.io/tasks?completed=false&page=1&limit=10

fetch(url, {
  method: 'GET',
  headers: {'content-type':'application/json'},
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(tasks => {
  // restler returns first 10 tasks that are not completed
}).catch(error => {
  // handle error
})
Отношения между ресурсами
Эти отношения, в свою очередь, используются для обработки вложенных URL-адресов. Например, если у нас есть ресурсы для пользователей и задач, мы можем определить отношение между ними, чтобы у пользователя было много задач. Это приведет к генерации следующих конечных точек:
Примеры кода
Если предположить, что ваш проект выглядит как на скриншоте выше, restler.io сгенерирует следующие конечные точки:
CRUD
Важно: Все примеры написаны на Javascript. Следует отметить несколько моментов:
(1) restler.io ожидает заголовок content-type:application/json,
(2) данные должны быть отправлены в виде JSON в теле запроса.
  1. Получить задачи

fetch('https://PROJECT_TOKEN.restler.io/users/1/tasks', {
  method: 'GET',
  headers: {'content-type':'application/json'},
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(tasks => {
  // Do something with the list of tasks
}).catch(error => {
  // handle error
})
2. Создать новую задачу

const newTask = {
  content: 'Check out restler.io',
  completed: false,
};

fetch('https://PROJECT_TOKEN.restler.io/users/1/tasks', {
  method: 'POST',
  headers: {'content-type':'application/json'},
  // Send your data in the request body as JSON
  body: JSON.stringify(newTask)
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(task => {
  // do something with the new task
}).catch(error => {
  // handle error
})
3. Отметить задачи как выполненные

fetch('https://PROJECT_TOKEN.restler.io/user/1/tasks/1', {
  method: 'PUT', // or PATCH
  headers: {'content-type':'application/json'},
  body: JSON.stringify({completed: true})
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(task => {
  // Do something with updated task
}).catch(error => {
  // handle error
})
4. Удалить задачи

fetch('https://<PROJECT_TOKEN.restler.io/users/1/tasks/1', {
  method: 'DELETE',
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(task => {
  // Do something with deleted task
}).catch(error => {
  // handle error
})
Фильтрация
Фильтрация осуществляется с помощью параметров поиска:
  1. Получить все задания, соответствующие строке `hello`

const url = new URL('https://PROJECT_TOKEN.restler.io/users/1/tasks');
url.searchParams.append('title', 'hello');

fetch(url, {
  method: 'GET',
  headers: {'content-type':'application/json'},
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(tasks => {
  // restler returns only tasks that match `hello` string
}).catch(error => {
  // handle error
})
2. Получить задания, которые не завершены

const url = new URL('https://PROJECT_TOKEN.restler.io/users/1/tasks');
url.searchParams.append('completed', false);

fetch(url, {
  method: 'GET',
  headers: {'content-type':'application/json'},
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(tasks => {
  // restler returns only incomplete tasks
}).catch(error => {
  // handle error
})
Пагинация
Фильтрация осуществляется с помощью параметров поиска:
  1. Получить первые 10 невыполненных задач

const url = new URL('https://PROJECT_TOKEN.restler.io/users/1/tasks');
url.searchParams.append('completed', false);
url.searchParams.append('page', 1);
url.searchParams.append('limit', 10);

fetch(url, {
  method: 'GET',
  headers: {'content-type':'application/json'},
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(tasks => {
  // restler returns first 10 tasks that are not completed
}).catch(error => {
  // handle error
})
Сортировка
Фильтрация осуществляется с помощью параметров поиска:
  1. Сортировка элементов в порядке возрастания

const url = new URL('https://PROJECT_TOKEN.restler.io/users/1/tasks');
url.searchParams.append('sortBy', 'title');
url.searchParams.append('order', 'desc'); // order parameter is optional and will default to `asc`

fetch(url, {
  method: 'GET',
  headers: {'content-type':'application/json'},
}).then(res => {
  if (res.ok) {
      return res.json();
  }
  // handle error
}).then(tasks => {
  // list of tasks sorted by title in descending order
}).catch(error => {
  // handle error
})
Кастомные ответы
По умолчанию restler.io возвращает один элемент или коллекцию элементов в зависимости от вызова API. Предположим, что у вас есть созданный ресурс задач:
Иногда мы хотим настроить данные. Например, для реализации пагинации нам может понадобиться, чтобы ответ выглядел примерно так:

{
  "count": 60,
  "tasks": [
    {
      "completed": false,
      "title": "Checkout restler.io!",
      "id": "1"
     }
  ]
}
К счастью, restler.io предоставляет простой интерфейс для этого. Откройте модальное окно Resource и прокрутите вниз до раздела Endpoints. Каждая конечная точка имеет поле, определяющее ее ответ. По умолчанию используется значение $mockData, которое ссылается на реальную запись (или коллекцию записей), хранящуюся в базе данных.
Вы можете заменить его на нужный JSON, например:

{
  "anyKey": "anyValue",
  "count": "$count",
  "tasks": "$mockData",
  "requestId": "$datatype.uuid"
}
  • «anyKey»: «anyValue» - это статические данные, которые всегда будут одинаковыми для всех запросов.
  • $count будет заменен на количество записей в базе данных
  • $mockData будет заменен на реальную запись (или коллекцию записей)
  • $datatype.uuid является методом Faker.js и будет выполняться при каждом вызове API.
Доступные методы Faker.js: