Partager via


Plugin MockResponsePlugin

Simule les réponses.

Capture d’écran d’une invite de commandes avec le proxy de développement simulant la réponse d’une demande à l’API GitHub.

Définition de l’instance de plug-in

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

Exemple de configuration

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

Propriétés de configuration

Propriété Descriptif Par défaut
mocksFile Chemin d’accès au fichier contenant des réponses fictives mocks.json
blockUnmockedRequests Retourner 502 Bad Gateway une réponse pour les requêtes qui ne sont pas simulées false

Options de ligne de commande

Nom Descriptif Par défaut
-n, --no-mocks Désactiver le chargement des demandes fictives false
--mocks-file Chemin d’accès au fichier contenant des réponses fictives -

Exemples de fichiers fictifs

Voici des exemples d’objets fictifs.

Répondre avec le corps

Réponse à une demande avec une réponse 200 OK et un corps 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"
          }
        ]
      }
    }
  ]
}

Répondre avec une erreur

Répondre à une demande avec une réponse 404 introuvable.

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

Répondre avec des données binaires

Répondez à une demande avec une image binaire chargée à partir d’un fichier sur le disque.

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

Répondre à la nth demande

Répondez à une demande uniquement après la deuxième fois qu’elle est appelée.

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

Répondre en correspondance avec le corps de la demande

Répondez à une demande qui contient une chaîne spécifique dans le corps.

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

Données de requête miroir en réponse

Répondez avec des données qui reflètent les valeurs du corps de la requête à l’aide @request.body.* d’espaces réservés.

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

Compte tenu de la demande suivante :

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 réponse est la suivante :

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
}

Propriétés de fichier fictifs

Propriété Descriptif Obligatoire
request Objet de requête qui définit la demande à répondre à oui
response Objet response qui définit la réponse à retourner oui

Objet de Requête

Chaque requête a les propriétés suivantes :

Propriété Descriptif Obligatoire Valeur par défaut Valeur d'échantillon
url URL absolue vers un point de terminaison d’API à répondre à oui https://jsonplaceholder.typicode.com/posts
method Verbe HTTP utilisé pour faire correspondre la requête avec url Non GET GET
nth Détermine que le proxy doit répondre uniquement après l’interception de la demande pour la nième fois Non 2
bodyFragment Chaîne qui doit être présente dans le corps de la requête Non foo

Remarques

Utilisez un astérisque (*) dans la url propriété si vous souhaitez correspondre à une série de caractères dans l’URL. Par exemple, https://jsonplaceholder.typicode.com/* correspond à https://jsonplaceholder.typicode.com/posts et https://jsonplaceholder.typicode.com/comments. Lors de l’exécution, le proxy de développement convertit chacun * en expression .*régulière.

Lors de la définition de fictives, placez d’abord les fictives les plus spécifiques. Par exemple, si vous avez deux maquettes, une pour https://jsonplaceholder.typicode.com/posts et une pour https://jsonplaceholder.typicode.com/*, placez la première maquette en premier. Sinon, le proxy de développement correspond au deuxième fictive en premier et retourne la réponse pour https://jsonplaceholder.typicode.com/* toutes les requêtes.

Utilisez la nth propriété si vous devez envoyer une autre URL de requête. Par exemple, utilisez-le pour simuler une opération de longue durée. La première fois que vous appelez l’API, elle retourne une réponse avec un inprogress message. La deuxième fois que vous appelez l’API, elle retourne une réponse avec le completed message. Pour plus d’informations sur la nth propriété, consultez la requête Mock nth.

À l’aide de la bodyFragment propriété, vous pouvez faire correspondre les demandes en fonction du contenu du corps. Par exemple, si vous souhaitez faire correspondre les requêtes qui contiennent la foo chaîne dans le corps, définissez la bodyFragment propriété foosur . Le proxy de développement utilise bodyFragment uniquement les requêtes autres que GET.

Objet Response

Chaque réponse a les propriétés suivantes :

Propriété Descriptif Obligatoire Valeur par défaut Valeur d'échantillon
body Corps à envoyer en tant que réponse à la demande Non vide { "foo": "bar" }
statusCode Code d’état HTTP de réponse Non 200 404
headers Tableau d’en-têtes à inclure dans la réponse Non vide [{ name: "content-type", "value": "application/json" }]

Remarques

Si vous souhaitez retourner des données binaires, définissez la body propriété sur une valeur de chaîne commençant @ par le chemin d’accès du fichier par rapport au fichier fictif. Par exemple, @picture.jpg retourne l’image stockée dans le picture.jpg fichier dans le même répertoire que le fichier fictif.

Pour mettre en miroir les données de requête dans la réponse, utilisez @request.body.* des espaces réservés dans le corps de la réponse. Par exemple, @request.body.displayName retourne la valeur de la displayName propriété à partir du corps de la requête. Cette fonctionnalité fonctionne avec les objets et tableaux imbriqués, ce qui vous permet de créer des réponses dynamiques qui reflètent les données de requête entrantes. Le remplacement de l’espace réservé prend en charge différents types de valeurs JSON, notamment les chaînes, les nombres, les booléens et les objets complexes.

Étape suivante