Bagikan melalui


Plugin Respons Tiruan

Mensimulasikan respons.

Cuplikan layar prompt perintah dengan respons simulasi Dev Proxy untuk permintaan ke GITHub API.

Definisi instans plugin

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

Contoh konfigurasi

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

Properti konfigurasi

Harta benda Deskripsi Bawaan
mocksFile Jalur ke file yang berisi respons tiruan mocks.json
blockUnmockedRequests Respons pengembalian 502 Bad Gateway untuk permintaan yang tidak ditiru false

Opsi Baris Perintah

Nama Deskripsi Bawaan
-n, --no-mocks Menonaktifkan pemuatan permintaan tiruan false
--mocks-file Jalur ke file yang berisi respons tiruan -

Contoh file tiruan

Berikut ini adalah contoh objek tiruan.

Merespons dengan isi

Respons terhadap permintaan dengan respons 200 OK dan isi 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"
          }
        ]
      }
    }
  ]
}

Merespons dengan kesalahan

Tanggapi permintaan dengan respons 404 Tidak Ditemukan.

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

Merespons dengan data biner

Tanggapi permintaan dengan gambar biner yang dimuat dari file pada disk.

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

Merespons sesuai nth permintaan

Tanggapi permintaan hanya setelah kedua kalinya dipanggil.

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

Merespons pencocokan isi permintaan

Tanggapi permintaan yang berisi string tertentu dalam isi.

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

Mencerminkan data permintaan sebagai respons

Merespons dengan data yang mencerminkan nilai dari isi permintaan menggunakan @request.body.* tempat penampung.

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

Mengingat permintaan berikut:

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

Responsnya adalah:

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
}

Properti file tiruan

Harta benda Deskripsi Diperlukan
request Objek permintaan yang menentukan permintaan untuk merespons Ya
response Objek respons yang menentukan respons untuk dikembalikan Ya

Objek permintaan

Setiap permintaan memiliki properti berikut:

Harta benda Deskripsi Diperlukan Nilai standar Nilai sampel
url URL absolut ke titik akhir API untuk merespons Ya https://jsonplaceholder.typicode.com/posts
method Kata kerja HTTP yang digunakan untuk mencocokkan permintaan dengan url Tidak GET GET
nth Menentukan bahwa proksi harus merespons hanya setelah saat mencegat permintaan untuk ke-n kalinya Tidak 2
bodyFragment String yang harus ada di isi permintaan Tidak foo

Komentar

Gunakan tanda bintang (*) di url properti jika Anda ingin mencocokkan serangkaian karakter dalam URL. Misalnya, https://jsonplaceholder.typicode.com/* cocok dengan https://jsonplaceholder.typicode.com/posts dan https://jsonplaceholder.typicode.com/comments. Pada runtime, Dev Proxy mengonversi masing-masing * menjadi ekspresi .*reguler .

Saat menentukan tiruan, tempatkan tiruan yang paling spesifik terlebih dahulu. Misalnya, jika Anda memiliki dua tiruan, satu untuk https://jsonplaceholder.typicode.com/posts dan satu untuk https://jsonplaceholder.typicode.com/*, letakkan tiruan pertama terlebih dahulu. Jika tidak, Dev Proxy cocok dengan tiruan kedua terlebih dahulu dan mengembalikan respons untuk https://jsonplaceholder.typicode.com/* semua permintaan.

nth Gunakan properti jika Anda perlu mengirim yang berbeda ke URL permintaan yang sama. Misalnya, gunakan untuk mensimulasikan operasi yang berjalan lama. Saat pertama kali Anda memanggil API, api mengembalikan respons dengan pesan inprogress . Kedua kalinya Anda memanggil API, api mengembalikan respons dengan completed pesan. Untuk informasi selengkapnya tentang nth properti ini, lihat Permintaan mock nth.

bodyFragment Dengan menggunakan properti , Anda dapat mencocokkan permintaan berdasarkan konten isi. Misalnya, jika Anda ingin mencocokkan permintaan yang berisi foo string dalam isi, atur bodyFragment properti ke foo. Dev Proxy hanya menggunakan bodyFragment untuk permintaan selain GET.

Objek respons

Setiap respons memiliki properti berikut:

Harta benda Deskripsi Diperlukan Nilai standar Nilai sampel
body Isi untuk dikirim sebagai respons terhadap permintaan Tidak kosong { "foo": "bar" }
statusCode Kode status HTTP respons Tidak 200 404
headers Array header yang akan disertakan dalam respons Tidak kosong [{ name: "content-type", "value": "application/json" }]

Komentar

Jika Anda ingin mengembalikan data biner, atur body properti ke nilai string yang dimulai dengan diikuti dengan @ jalur file relatif terhadap file tiruan. Misalnya, @picture.jpg mengembalikan gambar yang disimpan dalam picture.jpg file dalam direktori yang sama dengan file tiruan.

Untuk mencerminkan data permintaan dalam respons, gunakan @request.body.* tempat penampung di isi respons. Misalnya, @request.body.displayName mengembalikan nilai displayName properti dari isi permintaan. Fitur ini berfungsi dengan objek dan array berlapis, memungkinkan Anda membuat respons dinamis yang mencerminkan data permintaan masuk. Penggantian tempat penampung mendukung berbagai jenis nilai JSON termasuk string, angka, boolean, dan objek kompleks.

Langkah selanjutnya