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


CrudApiPlugin (КрудApiPlugin)

Имитирует API CRUD с хранилищем данных в памяти. Отправляет ответы JSON. Поддерживает CORS для использования между доменами из клиентских приложений. При необходимости имитирует API CRUD, защищенные с помощью Microsoft Entra.

снимок экрана командной строки с прокси-сервером разработки, имитацией API CRUD.

Определение экземпляра подключаемого модуля

{
  "name": "CrudApiPlugin",
  "enabled": true,
  "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
  "configSection": "customersApi"
}

Пример конфигурации

{
  "customersApi": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/crudapiplugin.schema.json",
    "apiFile": "customers-api.json"
  }
}

Свойства конфигурации

Свойство Описание
apiFile Путь к файлу, который содержит определение API CRUD

Параметры командной строки

Никакой

Пример файла API

Ниже приведены несколько примеров файлов API, определяющих API CRUD для получения сведений о клиентах.

Анонимный API CRUD

Ниже приведен пример файла API, который определяет анонимный API CRUD для получения сведений о клиентах.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/crudapiplugin.apifile.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": "update",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    },
    {
      "action": "delete",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    }
  ]
}

API CRUD, защищенный с помощью Microsoft Entra, с помощью одной области

Ниже приведен пример файла API, который определяет API CRUD для получения сведений о клиентах, защищенных с помощью Microsoft Entra. Все действия защищены одной областью. CrudApiPlugin проверяет аудиторию маркеров, издателя и область.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/crudapiplugin.apifile.schema.json",
  "baseUrl": "https://api.contoso.com/v1/customers",
  "dataFile": "customers-data.json",
  "auth": "entra",
  "entraAuthConfig": {
    "audience": "https://api.contoso.com",
    "issuer": "https://login.microsoftonline.com/contoso.com",
    "scopes": ["api://contoso.com/user_impersonation"]
  },
  "actions": [
    {
      "action": "getAll"
    },
    {
      "action": "getOne",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    },
    {
      "action": "create"
    },
    {
      "action": "merge",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    },
    {
      "action": "update",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    },
    {
      "action": "delete",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]"
    }
  ]
}

API CRUD, защищенный с помощью Microsoft Entra, с помощью определенных областей

Ниже приведен пример файла API, который определяет API CRUD для получения сведений о клиентах, защищенных с помощью Microsoft Entra. Действия защищены определенными областями. CrudApiPlugin проверяет аудиторию маркеров, издателя и область.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/crudapiplugin.apifile.schema.json",
  "baseUrl": "https://api.contoso.com/v1/customers",
  "dataFile": "customers-data.json",
  "auth": "entra",
  "entraAuthConfig": {
    "audience": "https://api.contoso.com",
    "issuer": "https://login.microsoftonline.com/contoso.com"
  },
  "actions": [
    {
      "action": "getAll",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.read"]
      }
    },
    {
      "action": "getOne",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.read"]
      }
    },
    {
      "action": "create",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.write"]
      }
    },
    {
      "action": "merge",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.write"]
      }
    },
    {
      "action": "update",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.write"]
      }
    },
    {
      "action": "delete",
      "url": "/{customer-id}",
      "query": "$.[?(@.id == {customer-id})]",
      "auth": "entra",
      "entraAuthConfig": {
        "scopes": ["api://contoso.com/customer.write"]
      }
    }
  ]
}

Свойства файла API

Свойство Описание Обязательно
actions Список действий, поддерживаемых API. Да
auth Определяет, является ли API защищенным или нет. Допустимые значения: none, entra. none по умолчанию Нет
baseUrl Базовый URL-адрес, в котором прокси-сервер разработки предоставляет URL-адрес. Прокси-сервер разработки предварительно определяет базовый URL-адрес URL-адресов, которые вы определяете в действиях. Да
dataFile Путь к файлу, который содержит данные для API. Да
entraAuthConfig Настройка проверки подлинности Microsoft Entra. Да, при настройке auth на entra

Вы можете ссылаться на dataFile с помощью абсолютного или относительного пути. Прокси-сервер разработки разрешает относительные пути относительно файла определения API.

dataFile должен определить массив JSON. Массив может быть пустым или содержать начальный набор объектов.

Свойства EntraAuthConfig

При настройке свойства auth для entraнеобходимо определить свойство entraAuthConfig. Если вы не определите его, CrudApiPlugin отображает предупреждение и API доступен анонимно.

Вы можете определить entraAuthConfig в файле API и каждом действии API. При определении его в файле API он применяется ко всем действиям. При определении его в действии он переопределяет конфигурацию файла API для этого конкретного действия.

Свойство entraAuthConfig имеет следующие свойства.

Свойство Описание Обязательно По умолчанию
audience Укажите допустимую аудиторию для маркера. При указании CrudApiPlugin сравнивает аудиторию из маркера с этой аудиторией. Если они отличаются, CrudApiPlugin возвращает 401 несанкционированный ответ. Нет Никакой
issuer Укажите допустимый издатель маркера. При указании CrudApiPlugin сравнивает издателя из маркера с этим издателем. Если они отличаются, CrudApiPlugin возвращает 401 несанкционированный ответ. Нет Никакой
scopes Укажите массив допустимых областей. При указании CrudApiPlugin управляет, если в маркере присутствует любой из областей. Если ни в чем из областей нет, CrudApiPlugin возвращает 401 несанкционированный ответ. Нет Никакой
roles Укажите массив допустимых ролей. При указании CrudApiPlugin управляет, если в маркере присутствует любой из ролей. Если ни ни из ролей нет, CrudApiPlugin возвращает 401 неавторизованный ответ. Нет Никакой
validateLifetime Установите значение true для CrudApiPlugin, чтобы проверить, не истек ли срок действия маркера. Когда CrudApiPlugin обнаруживает истекший срок действия маркера, он возвращает 401 несанкционированный ответ. Нет false
validateSigningKey Установите значение true для CrudApiPlugin, чтобы проверить подлинность маркера. Когда CrudApiPlugin обнаруживает маркер с недопустимой подписью (например, из-за изменения маркера вручную), он возвращает 401 несанкционированный ответ. Нет false

Свойства действия

Каждое действие в списке actions имеет следующие свойства.

Свойство Описание Обязательно По умолчанию
action Определяет, как прокси-сервер разработки взаимодействует с данными. Возможные значения: getAll, getOne, getMany, create, merge, update, delete. Да Никакой
auth Определяет, является ли действие защищенным или нет. Допустимые значения: none, entra. Нет none
entraAuthConfig Настройка проверки подлинности Microsoft Entra. Да, при настройке auth на entra Никакой
method Метод HTTP, который используется для предоставления действия прокси-сервера разработки. Нет Зависит от действия
query Newtonsoft JSONPath запрос, который используется для поиска данных в файле данных. Нет Пустой
url URL-адрес, в котором прокси-сервер разработки предоставляет действие. Прокси-сервер разработки добавляет URL-адрес к базовому URL-адресу. Нет Пустой

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

В запросе можно использовать тот же параметр. Например, если определить url как /customers/{customer-id} и query как $.[?(@.id == {customer-id})], прокси-сервер разработки заменяет параметр {customer-id} в запросе значением из URL-адреса запроса.

Важный

Dev Proxy реализует JSONPath в свойстве query с помощью Newtonsoft.Json. Существуют некоторые ограничения на использование, например, он поддерживает только одинарные кавычки. Перед отправкой проблемы обязательно проверьте запрос.

Если подключаемый модуль не может найти данные в файле данных с помощью запроса, он возвращает 404 Not Found ответ.

Каждый тип действия имеет метод HTTP по умолчанию. Можно переопределить значение по умолчанию, указав свойство method. Например, тип действия get имеет метод GETпо умолчанию. Если вы хотите использовать POST вместо этого, укажите свойство method как POST.

Массив actions определил коллекцию действий, которые требуется макетировать. Можно определить несколько действий для одного и того же метода HTTP и типа действия. Например, можно определить два действия getOne, один из них извлекает клиента по идентификатору и другому по адресу электронной почты. Обязательно определите уникальные URL-адреса для каждого действия.

Действия

Прокси-сервер разработки поддерживает следующие действия для API CRUD.

Действие Описание Метод по умолчанию
getAll Возвращает все элементы из файла данных. GET
getOne Возвращает один элемент из файла данных. Сбой при совпадении запроса с несколькими элементами. GET
getMany Возвращает несколько элементов из файла данных. Возвращает пустой массив, если запрос не соответствует элементам. GET
create Добавляет новый элемент в коллекцию данных. POST
merge Объединяет данные из запроса с данными из файла данных. PATCH
update Заменяет данные в файле данных данными из запроса. PUT
delete Удаляет элемент из файла данных. DELETE

При создании нового элемента с помощью действия create подключаемый модуль не проверяет его форму и добавляет его в коллекцию данных as-is.

Пример файла данных

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

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