MockResponsePlugin

Symuluje odpowiedzi.

Zrzut ekranu przedstawiający wiersz polecenia z serwerem proxy deweloperów symulującym odpowiedź na żądanie do interfejsu API usługi GitHub.

Przykład konfiguracji

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.0.0/rc.schema.json",
  "plugins": [
    {
      "name": "MockResponsePlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "mocksPlugin"
    }
  ],
  "mocksPlugin": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.0.0/mockresponseplugin.schema.json",
    "mocksFile": "mocks.json"
  }
}

Właściwości konfiguracji

Majątek Opis Wartość domyślna
mocksFile Ścieżka do pliku zawierającego pozorne odpowiedzi mocks.json
blockUnmockedRequests Zwracanie 502 Bad Gateway odpowiedzi dla żądań, które nie są wyśmiewane false

Opcje wiersza polecenia

Nazwa Opis Wartość domyślna
-n, --no-mocks Wyłączanie ładowania pozornych żądań false
--mocks-file Ścieżka do pliku zawierającego pozorne odpowiedzi -

Przykłady plików makiety

Wskazówka

Aby utworzyć plik makiety z plików z nieprzetworzonymi odpowiedziami HTTP, użyj mocks from-http-responses polecenia .

Poniżej przedstawiono przykłady pozornych obiektów.

Odpowiadanie za pomocą treści

Odpowiedź na żądanie z odpowiedzią 200 OK i treścią JSON.

Plik: mocks.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.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"
          }
        ]
      }
    }
  ]
}

Odpowiadanie z powodu błędu

Odpowiedz na żądanie za pomocą odpowiedzi 404 Nie znaleziono.

Plik: mocks.json

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

Odpowiadanie przy użyciu danych binarnych

Odpowiadanie na żądanie przy użyciu obrazu binarnego załadowanego z pliku na dysku.

Plik: mocks.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.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"
          }
        ]
      }
    }
  ]
}

Odpowiadanie na nth żądanie

Odpowiadaj tylko na drugie zgodne żądanie. Serwer proxy deweloperów przekazuje inne żądania do interfejsu API.

Plik: mocks.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.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
        }
      }
    }
  ]
}

Odpowiadanie na dopasowanie treści żądania

Odpowiedz na żądanie, które zawiera określony ciąg w treści.

Plik: mocks.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.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..."
        }
      }
    }
  ]
}

Dublowanie danych żądania w odpowiedzi

Odpowiadanie przy użyciu danych, które dubluje wartości z treści żądania przy użyciu @request.body.* symboli zastępczych.

Plik: mocks.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v4.0.0/mockresponseplugin.mocksfile.schema.json",
  "mocks": [
    {
      "request": {
        "url": "https://graph.microsoft.com/v1.0/users",
        "method": "POST"
      },
      "response": {
        "statusCode": 201,
        "body": {
          "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity",
          "id": "12345678-1234-1234-1234-123456789abc",
          "businessPhones": "@request.body.businessPhones",
          "displayName": "@request.body.displayName",
          "givenName": "@request.body.givenName",
          "jobTitle": "@request.body.jobTitle",
          "mail": "@request.body.mail",
          "userPrincipalName": "@request.body.userPrincipalName",
          "accountEnabled": "@request.body.accountEnabled",
          "createdDateTime": "2024-01-15T10:30:00Z"
        },
        "headers": [
          {
            "name": "Content-Type",
            "value": "application/json; odata.metadata=minimal"
          },
          {
            "name": "Location",
            "value": "https://graph.microsoft.com/v1.0/users/12345678-1234-1234-1234-123456789abc"
          }
        ]
      }
    }
  ]
}

Biorąc pod uwagę następujące żądanie:

POST https://graph.microsoft.com/v1.0/users
Content-Type: application/json

{
  "displayName": "Megan Bowen",
  "userPrincipalName": "MeganB@M365x214355.onmicrosoft.com",
  "accountEnabled": true,
  "givenName": "Megan",
  "surname": "Bowen",
  "jobTitle": "Product Manager"
}

Odpowiedź to:

HTTP/1.1 200 Connection Established
Content-Length: 0

HTTP/1.1 201 Created
Cache-Control: no-store
x-ms-ags-diagnostic: 
Strict-Transport-Security: 
request-id: 12345678-1234-1234-1234-123456789abc
client-request-id: 12345678-1234-1234-1234-123456789abc
Date: 9/10/2025 10:28:35 AM
Content-Type: application/json; odata.metadata=minimal
Location: https://graph.microsoft.com/v1.0/users/12345678-1234-1234-1234-123456789abc
OData-Version: 4.0
Content-Length: 648

{
  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity",
  "id": "12345678-1234-1234-1234-123456789abc",
  "businessPhones": null,
  "displayName": "Megan Bowen",
  "givenName": "Megan",
  "jobTitle": "Product Manager",
  "mail": null,
  "mobilePhone": null,
  "officeLocation": null,
  "preferredLanguage": null,
  "surname": "Bowen",
  "userPrincipalName": "MeganB@M365x214355.onmicrosoft.com",
  "accountEnabled": true,
  "createdDateTime": "2024-01-15T10:30:00Z",
  "department": null,
  "companyName": null,
  "city": null,
  "country": null,
  "postalCode": null,
  "state": null,
  "streetAddress": null,
  "usageLocation": null
}

Makietuje właściwości pliku

Majątek Opis Wymagane
request Obiekt żądania , który definiuje żądanie, na które ma odpowiadać tak
response Obiekt odpowiedzi definiujący odpowiedź do zwrócenia tak

Obiekt żądania

Każde żądanie ma następujące właściwości:

Majątek Opis Wymagane Wartość domyślna Przykładowa wartość
url Bezwzględny adres URL do punktu końcowego interfejsu API, na który ma odpowiadać tak https://jsonplaceholder.typicode.com/posts
method Czasownik HTTP używany do dopasowania żądania z url Nie GET GET
nth Odpowiedź tylko na nth przechwycone żądanie, które pasuje do makiety method, urli bodyFragment Nie 2
bodyFragment Ciąg, który powinien znajdować się w treści żądania Nie foo

Uwagi

Użyj gwiazdki () we * właściwości ,url jeśli chcesz dopasować dowolną serię znaków w adresie URL. Na przykład https://jsonplaceholder.typicode.com/* dopasowania https://jsonplaceholder.typicode.com/posts i https://jsonplaceholder.typicode.com/comments. W środowisku uruchomieniowym serwer proxy deweloperów konwertuje każdy * z nich na wyrażenie .*regularne .

Serwer proxy deweloperów ignoruje wielkość liter podczas dopasowywania url właściwości do adresu URL żądania. Na przykład pozorowanie dopasowania https://jsonplaceholder.typicode.com/Posts żądania do https://jsonplaceholder.typicode.com/posts. Jeśli zdefiniujesz wiele makiety dla tej samej metody z adresami URL, które różnią się tylko wielkością, serwer proxy deweloperów używa pierwszego zgodnego makiety.

Podczas definiowania makiety należy najpierw umieścić najbardziej specyficzne makiety. Jeśli na przykład masz dwa makiety, jeden dla https://jsonplaceholder.typicode.com/posts i jeden dla https://jsonplaceholder.typicode.com/*, najpierw umieść pierwszy makiety. W przeciwnym razie serwer proxy deweloperów jest zgodny z drugim pozorem i zwraca odpowiedź dla https://jsonplaceholder.typicode.com/* wszystkich żądań.

nth Użyj właściwości , jeśli chcesz wysłać inną odpowiedź do tego samego adresu URL żądania. Na przykład użyj go do symulowania długotrwałej operacji. Przy pierwszym wywołaniu interfejsu API zwraca ona odpowiedź z komunikatem inprogress . Po drugim wywołaniu interfejsu API zwraca odpowiedź z komunikatem completed . Serwer proxy dev liczy każde przechwycone żądanie zgodne z pozoru method, urli bodyFragment, niezależnie od tego, czy zwraca pozorną odpowiedź. Nie potrzebujesz pozoru rezerwowego dla tego samego adresu URL: jeśli żaden pozor nie ma zastosowania do żądania, serwer proxy dewelopera przekazuje go do interfejsu API. Aby uzyskać więcej informacji na temat nth właściwości, zobacz Mock nth request .

bodyFragment Za pomocą właściwości można dopasować żądania na podstawie zawartości treści. Jeśli na przykład chcesz dopasować żądania zawierające foo ciąg w treści, ustaw bodyFragment właściwość na foowartość . Serwer proxy deweloperów używa bodyFragment tylko dla żądań innych niż GET.

Obiekt odpowiedzi

Każda odpowiedź ma następujące właściwości:

Majątek Opis Wymagane Wartość domyślna Przykładowa wartość
body Treść do wysłania jako odpowiedź na żądanie Nie pusty { "foo": "bar" }
statusCode Kod stanu HTTP odpowiedzi Nie 200 404
headers Tablica nagłówków do uwzględnienia w odpowiedzi Nie pusty [{ name: "content-type", "value": "application/json" }]

Uwagi

Jeśli właściwość zostanie ustawiona body na obiekt lub tablicę JSON, serwer proxy dewelopera serializuje go na JSON. Jeśli ustawisz go na ciąg, serwer proxy dewelopera wysyła ciąg as-is, bez otaczających cudzysłowów. Użyj treści ciągu, aby zwrócić zwykły tekst, kod HTML, XML lub inną zawartość inną niż JSON. Ponieważ serwer proxy deweloperów content-type domyślnie ustawia nagłówek na application/json, ustaw również content-type nagłówek tak, aby był zgodny z zawartością, na przykład text/plain.

Jeśli chcesz zwrócić dane binarne, ustaw body właściwość na wartość ciągu, która zaczyna się @ od ścieżki pliku względem pliku makiety. Na przykład @picture.jpg zwraca obraz przechowywany w picture.jpg pliku w tym samym katalogu co plik makiety.

Aby dublować dane żądania w odpowiedzi, użyj @request.body.* symboli zastępczych w treści odpowiedzi. Na przykład @request.body.displayName zwraca wartość displayName właściwości z treści żądania. Ta funkcja działa z zagnieżdżonymi obiektami i tablicami, umożliwiając tworzenie dynamicznych odpowiedzi, które odzwierciedlają dane żądań przychodzących. Zamiana symbolu zastępczego obsługuje różne typy wartości JSON, w tym ciągi, liczby, wartości logiczne i obiekty złożone.

Następny krok