Прочитать на английском

Поделиться через


Имитация API CRUD

При создании приложений часто взаимодействуют с внутренними API. Иногда эти API еще недоступны или другие команды обновляют их в соответствии с последними требованиями. Чтобы избежать ожидания, обычно создается макет API, который возвращает необходимые данные. Хотя этот подход разблокирует вас, это требует времени для создания API, который вы в конечном итоге заменяете реальным. Чтобы избежать тратить время, можно использовать прокси разработки для имитации API CRUD и ускорения разработки.

Используя CrudApiPlugin, вы можете симулировать API CRUD (создание, чтение, обновление, удаление) с использованием внутренняего хранилища данных. С помощью простого файла конфигурации можно определить URL-адреса, поддерживаемые API макета и возвращаемые им данные. Плагин также поддерживает CORS для кросс-доменного использования в клиентских приложениях.

MockResponsePlugin позволяет вам определять статические макетные ответы, а CrudApiPlugin — динамический макетный API, который можно использовать для взаимодействия с данными и наблюдения за изменениями, отраженными в макетном наборе данных.

Сценарий

Предположим, вы создаете приложение, которое позволяет пользователям управлять клиентами. Чтобы получить данные, необходимо вызвать /customers конечную точку серверного API. Чтобы избежать ожидания завершения работы серверной команды, вы решили использовать прокси разработки для имитации API и возврата необходимых данных.

Начните с включения CrudApiPlugin и настройки его для использования файла customers-api.json.

JSON
{
  "name": "CrudApiPlugin",
  "enabled": true,
  "pluginPath": "~appFolder/plugins/dev-proxy-plugins.dll",
  "configSection": "customersApi"
}
JSON
{
  "customersApi": {
    "apiFile": "customers-api.json"
  }
}

В файле вы определяете API тестовых клиентов customers-api.json.

JSON
{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/crudapiplugin.schema.json",
  "baseUrl": "https://api.contoso.com/v1/customers",
  "dataFile": "customers-data.json",
  "actions": [
    {
      "action": "getAll"
    },
    {
      "action": "getOne",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    },
    {
      "action": "create"
    },
    {
      "action": "merge",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    },
    {
      "action": "delete",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    }
  ]
}

В свойстве baseUrl определяется базовый URL-адрес api макета. В свойстве dataFile определяется файл, содержащий макет данных клиента. В свойстве actions определяются поддерживаемые действия и их сопоставление с методами и URL-адресами HTTP. Вы хотите использовать API для:

  • получите всех клиентов через вызов GET /v1/customers
  • получите одного клиента, вызвав GET /v1/customers/{customer-id}
  • добавьте нового клиента, вызывая POST /v1/customers
  • обновление клиента путем вызова PATCH /v1/customers/{customer-id}
  • удаление клиента путем вызова DELETE /v1/customers/{customer-id}

В ваших URL-адресах вы используете параметр {customer-id}, который плагин заменяет фактическим идентификатором клиента из URL. Плагин также использует параметр {customer-id} в запросе JSONPath для поиска клиента в файле данных.

customers-data.json В файле определяется макет данных клиента.

JSON
[
  {
    "id": 1,
    "name": "Contoso",
    "address": "4567 Main St Buffalo, NY 98052"
  },
  {
    "id": 2,
    "name": "Fabrikam",
    "address": "4567 Main St Buffalo, NY 98052"
  }
]

Вы запускаете прокси-сервер разработки и вызываете конечную точку https://api.contoso.com/v1/customers . Прокси-сервер разработки перехватывает запрос и возвращает макет данных клиента.

JSON
[
  {
    "id": 1,
    "name": "Contoso",
    "address": "4567 Main St Buffalo, NY 98052"
  },
  {
    "id": 2,
    "name": "Fabrikam",
    "address": "4567 Main St Buffalo, NY 98052"
  }
]

Следующий шаг

Дополнительные сведения о CrudApiPlugin.

Примеры

См. также связанные примеры Dev Proxy: