MockResponsePlugin

Simula le risposte.

Screenshot di un prompt dei comandi con Dev Proxy che simula la risposta per una richiesta all'API GitHub.

Esempio di configurazione

{
  "$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"
  }
}

Proprietà di configurazione

Proprietà Descrizione Predefinito
mocksFile Percorso del file contenente risposte fittizie mocks.json
blockUnmockedRequests Risposta restituita 502 Bad Gateway per le richieste non fittizie false

Opzioni della riga di comando

Nome Descrizione Predefinito
-n, --no-mocks Disabilitare il caricamento di richieste fittizie false
--mocks-file Percorso del file contenente risposte fittizie -

Esempi di file fittizi

Di seguito sono riportati esempi di oggetti fittizi.

Rispondere con il corpo

Risposta a una richiesta con una risposta 200 OK e un corpo JSON.

File: 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"
          }
        ]
      }
    }
  ]
}

Rispondere con errore

Rispondere a una richiesta con una risposta 404 Non trovato.

File: 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
      }
    }
  ]
}

Rispondere con dati binari

Rispondere a una richiesta con un'immagine binaria caricata da un file su disco.

File: 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"
          }
        ]
      }
    }
  ]
}

Rispondere su nth richiesta

Rispondere solo alla seconda richiesta corrispondente. Dev Proxy passa altre richieste all'API.

File: 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
        }
      }
    }
  ]
}

Rispondere alla corrispondenza del corpo della richiesta

Rispondere a una richiesta che contiene una stringa specifica nel corpo.

File: 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..."
        }
      }
    }
  ]
}

Eseguire il mirroring dei dati della richiesta in risposta

Rispondere con i dati che rispecchiano i valori del corpo della richiesta usando @request.body.* segnaposto.

File: 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"
          }
        ]
      }
    }
  ]
}

Data la richiesta seguente:

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"
}

La risposta è:

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
}

Simula le proprietà del file

Proprietà Descrizione Obbligatorio
request Oggetto richiesta che definisce la richiesta di risposta Sì
response Oggetto risposta che definisce la risposta da restituire Sì

Oggetto della richiesta

Ogni richiesta ha le proprietà seguenti:

Proprietà Descrizione Obbligatorio Valore predefinito Valore di esempio
url URL assoluto di un endpoint API a cui rispondere Sì https://jsonplaceholder.typicode.com/posts
method Verbo HTTP usato per trovare una corrispondenza con la richiesta url No GET GET
nth Rispondere solo all'n° richiesta intercettata che corrisponde a method, urle bodyFragment No 2
bodyFragment Stringa che deve essere presente nel corpo della richiesta No foo

Osservazioni:

Usare l'asterisco (*) nella url proprietà se si desidera trovare una corrispondenza con qualsiasi serie di caratteri nell'URL. Ad esempio, https://jsonplaceholder.typicode.com/* corrisponde https://jsonplaceholder.typicode.com/posts a e https://jsonplaceholder.typicode.com/comments. In fase di esecuzione, Dev Proxy converte ognuno * in un'espressione .*regolare.

Dev Proxy ignora la distinzione tra maiuscole e minuscole quando corrisponde alla url proprietà rispetto all'URL della richiesta. Ad esempio, una simulazione per https://jsonplaceholder.typicode.com/Posts corrisponde a una richiesta a https://jsonplaceholder.typicode.com/posts. Se si definiscono più simulazioni per lo stesso metodo con URL che differiscono solo per la combinazione di maiuscole e minuscole, Dev Proxy usa la prima simulazione corrispondente.

Quando si definiscono simulazioni, posizionare prima le simulazioni più specifiche. Ad esempio, se sono presenti due simulazioni, una per https://jsonplaceholder.typicode.com/posts e una per https://jsonplaceholder.typicode.com/*, posizionare prima la prima simulazione. In caso contrario, Dev Proxy corrisponde al secondo mock first e restituisce la risposta per https://jsonplaceholder.typicode.com/* tutte le richieste.

Usare la nth proprietà se è necessario inviare una risposta diversa allo stesso URL della richiesta. Ad esempio, usarlo per simulare un'operazione a esecuzione prolungata. La prima volta che si chiama l'API, viene restituita una risposta con un inprogress messaggio. La seconda volta che si chiama l'API, viene restituita una risposta con il completed messaggio . Dev Proxy conta ogni richiesta intercettata che corrisponde a method, urle bodyFragment, che restituisca o meno una risposta fittizia. Non è necessario un mock di fallback per lo stesso URL: se non si applica alcuna simulazione a una richiesta, Dev Proxy lo passa all'API. Per altre informazioni sulla proprietà, vedere Mock nth request .For more information about the nth property, see Mock nth request.

Usando la bodyFragment proprietà , è possibile associare le richieste in base al contenuto del corpo. Ad esempio, se si desidera trovare una corrispondenza con le richieste che contengono la foo stringa nel corpo, impostare la bodyFragment proprietà su foo. Dev Proxy usa bodyFragment solo per le richieste diverse da GET.

Oggetto Response

Ogni risposta ha le proprietà seguenti:

Proprietà Descrizione Obbligatorio Valore predefinito Valore di esempio
body Corpo da inviare come risposta alla richiesta No vuoto { "foo": "bar" }
statusCode Codice di stato HTTP di risposta No 200 404
headers Matrice di intestazioni da includere nella risposta No vuoto [{ name: "content-type", "value": "application/json" }]

Osservazioni:

Se si imposta la body proprietà su un oggetto JSON o una matrice, Dev Proxy la serializza su JSON. Se lo si imposta su una stringa, Dev Proxy invia la stringa as-is, senza virgolette circostanti. Usare un corpo stringa per restituire testo normale, HTML, XML o altro contenuto non JSON. Poiché Dev Proxy imposta per impostazione predefinita l'intestazione content-type su application/json, impostare anche l'intestazione content-type in modo che corrisponda al contenuto, ad esempio text/plain.

Se si desidera restituire dati binari, impostare la body proprietà su un valore stringa che inizia con @ seguito dal percorso del file rispetto al file fittizio. Ad esempio, restituisce @picture.jpg l'immagine archiviata nel picture.jpg file nella stessa directory del file fittizio.

Per eseguire il mirroring dei dati della richiesta nella risposta, usare @request.body.* i segnaposto nel corpo della risposta. Ad esempio, restituisce @request.body.displayName il valore della displayName proprietà dal corpo della richiesta. Questa funzionalità funziona con oggetti e matrici annidati, consentendo di creare risposte dinamiche che riflettono i dati delle richieste in ingresso. La sostituzione del segnaposto supporta vari tipi di valori JSON, tra cui stringhe, numeri, valori booleani e oggetti complessi.

Passo successivo