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


Плагин MockResponsePlugin

Имитирует ответы.

Снимок экрана: командная строка с запросом на API GitHub с имитацией прокси-сервера разработки.

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

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

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

{
  "mocksPlugin": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/mockresponseplugin.schema.json",
    "mocksFile": "mocks.json"
  }
}

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

Недвижимость Описание По умолчанию
mocksFile Путь к файлу с макетными ответами mocks.json
blockUnmockedRequests Возврат 502 Bad Gateway ответа на запросы, которые не высмеивались false

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

Имя Описание По умолчанию
-n, --no-mocks Отключение запросов на загрузку макетов false
--mocks-file Путь к файлу с макетными ответами -

Примеры файлов макетов

Ниже приведены примеры макетных объектов.

Ответ с текстом

Ответ на запрос с ответом 200 OK и текстом JSON.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/mockresponseplugin.mocksfile.schema.json",
  "mocks": [
    {
      "request": {
        "url": "https://graph.microsoft.com/v1.0/me",
        "method": "GET"
      },
      "response": {
        "body": {
          "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity",
          "businessPhones": ["+1 412 555 0109"],
          "displayName": "Megan Bowen",
          "givenName": "Megan",
          "jobTitle": "Auditor",
          "mail": "MeganB@M365x214355.onmicrosoft.com",
          "mobilePhone": null,
          "officeLocation": "12/1110",
          "preferredLanguage": "en-US",
          "surname": "Bowen",
          "userPrincipalName": "MeganB@M365x214355.onmicrosoft.com",
          "id": "48d31887-5fad-4d73-a9f5-3c356e68a038"
        },
        "headers": [
          {
            "name": "content-type",
            "value": "application/json; odata.metadata=minimal"
          }
        ]
      }
    }
  ]
}

Ответ с ошибкой

Ответ на запрос с ответом 404 Not Found.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/mockresponseplugin.mocksfile.schema.json",
  "mocks": [
    {
      "request": {
        "url": "https://graph.microsoft.com/v1.0/me/photo",
        "method": "GET"
      },
      "response": {
        "statusCode": 404
      }
    }
  ]
}

Ответ с двоичными данными

Ответьте на запрос с двоичным изображением, загруженным из файла на диске.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/mockresponseplugin.mocksfile.schema.json",
  "mocks": [
    {
      "request": {
        "url": "https://graph.microsoft.com/v1.0/users/*/photo/$value",
        "method": "GET"
      },
      "response": {
        "body": "@picture.jpg",
        "headers": [
          {
            "name": "content-type",
            "value": "image/jpeg"
          }
        ]
      }
    }
  ]
}

Ответить по запросу nth

Отвечайте на запрос только после второго вызова.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/mockresponseplugin.mocksfile.schema.json",
  "mocks": [
    {
      "request": {
        "url": "https://graph.microsoft.com/v1.0/external/connections/*/operations/*",
        "method": "GET",
        "nth": 2
      },
      "response": {
        "statusCode": 200,
        "body": {
          "id": "1.neu.0278337E599FC8DBF5607ED12CF463E4.6410CCF8F6DB8758539FB58EB56BF8DC",
          "status": "completed",
          "error": null
        }
      }
    }
  ]
}

Реагирование на соответствие тексту запроса

Ответьте на запрос, содержащий определенную строку в тексте.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/mockresponseplugin.mocksfile.schema.json",
  "mocks": [
    {
      "request": {
        "url": "https://login.microsoftonline.com/fa15d692-e9c7-4460-a743-29f29522229/oauth2/v2.0/token",
        "method": "POST",
        "bodyFragment": "scope=https%3A%2F%2Fapi.contoso.com%2FDocuments.Read"
      },
      "response": {
        "headers": [
          {
            "name": "Content-Type",
            "value": "application/json; charset=utf-8"
          }
        ],
        "body": {
          "token_type": "Bearer",
          "expires_in": 3599,
          "ext_expires_in": 3599,
          "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSU..."
        }
      }
    }
  ]
}

Макеты свойств файла

Недвижимость Описание Обязательно
request Объект request , определяющий запрос для ответа да
response Объект ответа , определяющий ответ, возвращаемый да

Объект запроса

Каждый запрос имеет следующие свойства:

Недвижимость Описание Обязательно Значение по умолчанию Примерное значение
url Абсолютный URL-адрес конечной точки API для ответа да https://jsonplaceholder.typicode.com/posts
method HTTP-команда, используемая для сопоставления запросов с url нет GET GET
nth Определяет, что прокси-сервер должен отвечать только после перехвата запроса на n-е время нет 2
bodyFragment Строка, которая должна присутствовать в тексте запроса нет foo

Замечания

Используйте звездочку (*) в свойстве url , если вы хотите сопоставить любую серию символов в URL-адресе. Например, https://jsonplaceholder.typicode.com/* соответствует https://jsonplaceholder.typicode.com/posts и https://jsonplaceholder.typicode.com/comments. Во время выполнения прокси-сервер разработки преобразует каждый из них * в регулярное выражение .*.

При определении макетов сначала поместите наиболее конкретные макеты. Например, если у вас есть два макета, один для https://jsonplaceholder.typicode.com/posts одного и один для https://jsonplaceholder.typicode.com/*, поместите первый макет первым. В противном случае прокси-сервер разработки соответствует второму макету и возвращает ответ для https://jsonplaceholder.typicode.com/* всех запросов.

Используйте свойство, nth если необходимо отправить другой URL-адрес запроса. Например, используйте его для имитации длительной операции. При первом вызове API он возвращает ответ с сообщением inprogress . Во второй раз при вызове API он возвращает ответ с сообщением completed . Дополнительные сведения о свойстве см. в запросе nthMock nth.

bodyFragment Используя свойство, можно сопоставить запросы на основе содержимого текста. Например, если вы хотите сопоставить запросы, содержащие foo строку в тексте, задайте bodyFragment для свойства fooзначение . Прокси-сервер разработки используется bodyFragment только для запросов, отличных от GET.

Объект Response

Каждый ответ имеет следующие свойства:

Недвижимость Описание Обязательно Значение по умолчанию Примерное значение
body Текст для отправки в качестве ответа на запрос нет пустой { "foo": "bar" }
statusCode Код состояния HTTP ответа нет 200 404
headers Массив заголовков для включения в ответ нет пустой [{ name: "content-type", "value": "application/json" }]

Замечания

Если требуется возвращать двоичные данные, задайте body для свойства строковое значение, которое начинается с @ пути к файлу-макету относительно файла макетов. Например, возвращает изображение, хранящееся в @picture.jpg файле в том же каталоге, picture.jpg что и файл макетов.

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