JsonPatch in ASP.NET Core-web-API
In dit artikel wordt uitgelegd hoe u JSON Patch-aanvragen kunt verwerken in een ASP.NET Core-web-API.
Pakketinstallatie
Ondersteuning voor JSON Patch in ASP.NET Core-web-API is gebaseerd op Newtonsoft.Json
en vereist het Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet-pakket. JSON Patch-ondersteuning inschakelen:
Installeer het
Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet-pakket.Bel AddNewtonsoftJson. Bijvoorbeeld:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddNewtonsoftJson(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
AddNewtonsoftJson
vervangt de standaard op System.Text.Json
gebaseerde invoer- en uitvoerindelingen die worden gebruikt voor het opmaken van alle JSON-inhoud. Deze extensiemethode is compatibel met de volgende MVC-serviceregistratiemethoden:
JsonPatch vereist het instellen van de Content-Type
-header op application/json-patch+json
.
Ondersteuning voor JSON Patch toevoegen bij het gebruik van System.Text.Json
De System.Text.Json
-based input formatter biedt geen ondersteuning voor JSON Patch. Ondersteuning voor JSON Patch toevoegen met behulp van Newtonsoft.Json
, terwijl de andere invoer- en uitvoerindelingen ongewijzigd blijven:
Installeer het
Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet-pakket.Program.cs
bijwerken:using JsonPatchSample; using Microsoft.AspNetCore.Mvc.Formatters; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(options => { options.InputFormatters.Insert(0, MyJPIF.GetJsonPatchInputFormatter()); }); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.Options; namespace JsonPatchSample; public static class MyJPIF { public static NewtonsoftJsonPatchInputFormatter GetJsonPatchInputFormatter() { var builder = new ServiceCollection() .AddLogging() .AddMvc() .AddNewtonsoftJson() .Services.BuildServiceProvider(); return builder .GetRequiredService<IOptions<MvcOptions>>() .Value .InputFormatters .OfType<NewtonsoftJsonPatchInputFormatter>() .First(); } }
Met de voorgaande code wordt een exemplaar van NewtonsoftJsonPatchInputFormatter gemaakt en als het eerste element in de MvcOptions.InputFormatters-collectie ingevoegd. Deze registratievolgorde zorgt ervoor dat:
-
NewtonsoftJsonPatchInputFormatter
verwerkt JSON Patch-aanvragen. - De bestaande op
System.Text.Json
gebaseerde input en formatters verwerken alle andere JSON-aanvragen en -antwoorden.
Gebruik de methode Newtonsoft.Json.JsonConvert.SerializeObject
om een JsonPatchDocumentte serialiseren.
HTTP-aanvraagmethode PATCH
De methoden PUT en PATCH worden gebruikt om een bestaande resource bij te werken. Het verschil is dat PUT de hele resource vervangt, terwijl PATCH alleen de wijzigingen opgeeft.
JSON-patch
JSON Patch is een indeling voor het opgeven van updates die moeten worden toegepast op een resource. Een JSON Patch-document bevat een matrix met bewerkingen. Elke bewerking identificeert een bepaald type wijziging. Voorbeelden van dergelijke wijzigingen zijn het toevoegen van een matrixelement of het vervangen van een eigenschapswaarde.
De volgende JSON-documenten vertegenwoordigen bijvoorbeeld een resource, een JSON Patch-document voor de resource en het resultaat van het toepassen van de patchbewerkingen.
Bronvoorbeeld
{
"customerName": "John",
"orders": [
{
"orderName": "Order0",
"orderType": null
},
{
"orderName": "Order1",
"orderType": null
}
]
}
Voorbeeld van JSON-patch
[
{
"op": "add",
"path": "/customerName",
"value": "Barry"
},
{
"op": "add",
"path": "/orders/-",
"value": {
"orderName": "Order2",
"orderType": null
}
}
]
In de voorgaande JSON:
- De eigenschap
op
geeft het type bewerking aan. - De eigenschap
path
geeft het element aan dat moet worden bijgewerkt. - De eigenschap
value
biedt de nieuwe waarde.
Resource na de patch
Dit is de resource na het toepassen van het voorgaande JSON Patch-document:
{
"customerName": "Barry",
"orders": [
{
"orderName": "Order0",
"orderType": null
},
{
"orderName": "Order1",
"orderType": null
},
{
"orderName": "Order2",
"orderType": null
}
]
}
De wijzigingen die zijn aangebracht door een JSON Patch-document toe te passen op een resource, zijn atomisch. Als een bewerking in de lijst mislukt, wordt er geen bewerking in de lijst toegepast.
Padsyntaxis
De eigenschap van het "/address/zipCode"
.
Indexen op basis van nul worden gebruikt om matrixelementen op te geven. Het eerste element van de addresses
matrix bevindt zich op /addresses/0
. Als u aan het einde van een matrix wilt add
, gebruikt u een afbreekstreepje (-
) in plaats van een indexnummer: /addresses/-
.
Operaties
In de volgende tabel ziet u ondersteunde bewerkingen zoals gedefinieerd in de JSON Patch-specificatie:
Operatie | Notities |
---|---|
add |
Voeg een eigenschap of matrixelement toe. Voor bestaande eigenschap: waarde instellen. |
remove |
Een eigenschap of matrixelement verwijderen. |
replace |
Hetzelfde als remove gevolgd door add op dezelfde locatie. |
move |
Hetzelfde als remove van de bron, gevolgd door add naar de bestemming met behulp van de waarde uit de bron. |
copy |
Hetzelfde als add naar bestemming met behulp van waarde uit de bron. |
test |
Retourneer de success-statuscode als de waarde op path = opgegeven value . |
JSON Patch in ASP.NET Core
De ASP.NET Core-implementatie van JSON Patch is beschikbaar in het Microsoft.AspNetCore.JsonPatch NuGet-pakket.
Code van actiemethode
In een API-controller, een actiemethode voor JSON Patch:
- Wordt geannoteerd met het kenmerk
HttpPatch
. - Accepteert een JsonPatchDocument<TModel>, meestal met
[FromBody]
. - Roept ApplyTo(Object) aan in het patchdocument om de wijzigingen toe te passen.
Hier volgt een voorbeeld:
[HttpPatch]
public IActionResult JsonPatchWithModelState(
[FromBody] JsonPatchDocument<Customer> patchDoc)
{
if (patchDoc != null)
{
var customer = CreateCustomer();
patchDoc.ApplyTo(customer, ModelState);
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return new ObjectResult(customer);
}
else
{
return BadRequest(ModelState);
}
}
Deze code van de voorbeeld-app werkt met het volgende Customer
model:
namespace JsonPatchSample.Models;
public class Customer
{
public string? CustomerName { get; set; }
public List<Order>? Orders { get; set; }
}
namespace JsonPatchSample.Models;
public class Order
{
public string OrderName { get; set; }
public string OrderType { get; set; }
}
De voorbeeldactiemethode:
- Maakt een
Customer
. - De patch wordt toegepast.
- Retourneert het resultaat in de hoofdtekst van het antwoord.
In een echte app haalt de code de gegevens op uit een archief, zoals een database, en werkt de database bij nadat de patch is toegepast.
Modeltoestand
In het voorgaande voorbeeld van de actiemethode wordt een overbelasting van ApplyTo
aangeroepen die de modelstatus als een van de parameters gebruikt. Met deze optie kunt u foutberichten in antwoorden krijgen. In het volgende voorbeeld ziet u de body van een 400 Ongeldige Aanvraagreactie bij een test
-bewerking:
{
"Customer": [
"The current value 'John' at path 'customerName' != test value 'Nancy'."
]
}
Dynamische objecten
In het volgende voorbeeld van een actiemethode ziet u hoe u een patch toepast op een dynamisch object:
[HttpPatch]
public IActionResult JsonPatchForDynamic([FromBody]JsonPatchDocument patch)
{
dynamic obj = new ExpandoObject();
patch.ApplyTo(obj);
return Ok(obj);
}
De toevoegbewerking
- Als
path
verwijst naar een matrixelement: voegt nieuw element in vóór het element dat is opgegeven doorpath
. - Als
path
verwijst naar een eigenschap: stelt de eigenschapswaarde in. - Als
path
verwijst naar een niet-bestaande locatie:- Als de resource die moet worden gepatcht een dynamisch object is: voegt een eigenschap toe.
- Als de resource om te patchen een statisch object is: de aanvraag mislukt.
In het volgende voorbeeldpatchdocument wordt de waarde van CustomerName
ingesteld en wordt een Order
-object toegevoegd aan het einde van de Orders
-matrix.
[
{
"op": "add",
"path": "/customerName",
"value": "Barry"
},
{
"op": "add",
"path": "/orders/-",
"value": {
"orderName": "Order2",
"orderType": null
}
}
]
De verwijderbewerking
- Als
path
verwijst naar een matrixelement: verwijdert het element. - Als
path
verwijst naar een eigenschap:- Als de resource om te patchen een dynamisch object is, wordt de eigenschap verwijderd.
- Als de resource om te patchen een statisch object is:
- Als de eigenschap nullable is: stelt deze in op null.
- Als de eigenschap niet nullbaar is, stelt u deze in op
default<T>
.
De volgende voorbeeldpatch stelt document CustomerName
in op null en verwijdert Orders[0]
:
[
{
"op": "remove",
"path": "/customerName"
},
{
"op": "remove",
"path": "/orders/0"
}
]
De vervangingsbewerking
Deze bewerking is functioneel hetzelfde als een remove
gevolgd door een add
.
In het volgende voorbeeldpatchdocument wordt de waarde van CustomerName
ingesteld en wordt Orders[0]
vervangen door een nieuw Order
-object:
[
{
"op": "replace",
"path": "/customerName",
"value": "Barry"
},
{
"op": "replace",
"path": "/orders/0",
"value": {
"orderName": "Order2",
"orderType": null
}
}
]
De verplaatsingsbewerking
- Als
path
verwijst naar een matrixelement: kopieertfrom
element naar de locatie vanpath
element en voert vervolgens eenremove
bewerking uit op hetfrom
element. - Als
path
verwijst naar een eigenschap: kopieert de waarde vanfrom
eigenschap naarpath
eigenschap en voert vervolgens eenremove
bewerking uit op de eigenschapfrom
. - Als
path
verwijst naar een niet-bestaande eigenschap:- Als de resource om te patchen een statisch object is: de aanvraag mislukt.
- Als de resource die moet worden gepatcht een dynamisch object is: kopieert
from
eigenschap naar de locatie aangegeven doorpath
en voert vervolgens eenremove
bewerking uit op de eigenschapfrom
.
Het volgende voorbeeldpatchdocument:
- Kopieert de waarde van
Orders[0].OrderName
naarCustomerName
. - Hiermee stelt u
Orders[0].OrderName
in op null. - Hiermee verplaatst u
Orders[1]
naar vóórOrders[0]
.
[
{
"op": "move",
"from": "/orders/0/orderName",
"path": "/customerName"
},
{
"op": "move",
"from": "/orders/1",
"path": "/orders/0"
}
]
De kopieerbewerking
Deze bewerking is functioneel hetzelfde als een move
bewerking zonder de laatste remove
stap.
Het volgende voorbeeldpatchdocument:
- Kopieert de waarde van
Orders[0].OrderName
naarCustomerName
. - Voegt een kopie van
Orders[1]
in vóórOrders[0]
.
[
{
"op": "copy",
"from": "/orders/0/orderName",
"path": "/customerName"
},
{
"op": "copy",
"from": "/orders/1",
"path": "/orders/0"
}
]
De testbewerking
Als de waarde op de locatie die wordt aangegeven door path
verschilt van de waarde in value
, mislukt de aanvraag. In dat geval mislukt de hele PATCH-aanvraag, zelfs als alle andere bewerkingen in het patchdocument anders zouden slagen.
De test
bewerking wordt vaak gebruikt om een update te voorkomen wanneer er een gelijktijdigheidsconflict is.
Het volgende voorbeeldpatchdocument heeft geen effect als de initiële waarde van CustomerName
'John' is, omdat de test mislukt:
[
{
"op": "test",
"path": "/customerName",
"value": "Nancy"
},
{
"op": "add",
"path": "/customerName",
"value": "Barry"
}
]
De code ophalen
voorbeeldcode weergeven of downloaden. (Hoe te downloaden).
Als u het voorbeeld wilt testen, voert u de app uit en verzendt u HTTP-aanvragen met de volgende instellingen:
- URL:
http://localhost:{port}/jsonpatch/jsonpatchwithmodelstate
- HTTP-methode:
PATCH
- Koptekst:
Content-Type: application/json-patch+json
- Hoofdtekst: Kopieer en plak een van de voorbeelden van JSON-patchdocumenten uit de JSON- projectmap.
Aanvullende informatiebronnen
In dit artikel wordt uitgelegd hoe u JSON Patch-aanvragen kunt verwerken in een ASP.NET Core-web-API.
Installatie van pakket
Voer de volgende stappen uit om ondersteuning voor JSON Patch in te schakelen in uw app:
Installeer het
Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet-pakket.Werk de
Startup.ConfigureServices
-methode van het project bij zodat deze AddNewtonsoftJsonaanroept. Bijvoorbeeld:services .AddControllersWithViews() .AddNewtonsoftJson();
AddNewtonsoftJson
is compatibel met de registratiemethoden van de MVC-service:
JSON Patch, AddNewtonsoftJson en System.Text.Json
AddNewtonsoftJson
vervangt de op System.Text.Json
gebaseerde invoer- en uitvoerformatters die worden gebruikt voor het opmaken van alle JSON-content. Als u ondersteuning wilt toevoegen voor JSON Patch met behulp van Newtonsoft.Json
, terwijl de andere formatters ongewijzigd blijven, werkt u de Startup.ConfigureServices
methode van het project als volgt bij:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(options =>
{
options.InputFormatters.Insert(0, GetJsonPatchInputFormatter());
});
}
private static NewtonsoftJsonPatchInputFormatter GetJsonPatchInputFormatter()
{
var builder = new ServiceCollection()
.AddLogging()
.AddMvc()
.AddNewtonsoftJson()
.Services.BuildServiceProvider();
return builder
.GetRequiredService<IOptions<MvcOptions>>()
.Value
.InputFormatters
.OfType<NewtonsoftJsonPatchInputFormatter>()
.First();
}
Voor de voorgaande code zijn het Microsoft.AspNetCore.Mvc.NewtonsoftJson
-pakket en de volgende using
-instructies vereist:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using System.Linq;
Gebruik de methode Newtonsoft.Json.JsonConvert.SerializeObject
om een JsonPatchDocument te serialiseren.
HTTP-aanvraagmethode PATCH
De methoden PUT en PATCH worden gebruikt om een bestaande resource bij te werken. Het verschil is dat PUT de hele resource vervangt, terwijl PATCH alleen de wijzigingen opgeeft.
JSON Patch
JSON Patch is een indeling voor het opgeven van updates die moeten worden toegepast op een resource. Een JSON Patch-document bevat een matrix met bewerkingen. Elke bewerking identificeert een bepaald type wijziging. Voorbeelden van dergelijke wijzigingen zijn het toevoegen van een matrixelement of het vervangen van een eigenschapswaarde.
De volgende JSON-documenten vertegenwoordigen bijvoorbeeld een resource, een JSON Patch-document voor de resource en het resultaat van het toepassen van de patchbewerkingen.
Voorbeeld van een hulpbron
{
"customerName": "John",
"orders": [
{
"orderName": "Order0",
"orderType": null
},
{
"orderName": "Order1",
"orderType": null
}
]
}
Voorbeeld van JSON-patch
[
{
"op": "add",
"path": "/customerName",
"value": "Barry"
},
{
"op": "add",
"path": "/orders/-",
"value": {
"orderName": "Order2",
"orderType": null
}
}
]
In de voorgaande JSON:
- De eigenschap
op
geeft het type bewerking aan. - De eigenschap
path
geeft het element aan dat moet worden bijgewerkt. - De eigenschap
value
biedt de nieuwe waarde.
De resource na de patch
Dit is de resource na het toepassen van het voorgaande JSON Patch-document:
{
"customerName": "Barry",
"orders": [
{
"orderName": "Order0",
"orderType": null
},
{
"orderName": "Order1",
"orderType": null
},
{
"orderName": "Order2",
"orderType": null
}
]
}
De wijzigingen die zijn aangebracht door een JSON Patch-document toe te passen op een resource, zijn atomisch. Als een bewerking in de lijst mislukt, wordt er geen bewerking in de lijst toegepast.
Padsyntaxis
De eigenschap van het "/address/zipCode"
.
Indexen op basis van nul worden gebruikt om matrixelementen op te geven. Het eerste element van de addresses
matrix bevindt zich op /addresses/0
. Als u aan het einde van een matrix wilt add
, gebruikt u een afbreekstreepje (-
) in plaats van een indexnummer: /addresses/-
.
Operaties
In de volgende tabel ziet u ondersteunde bewerkingen zoals gedefinieerd in de JSON Patch-specificatie:
Operatie | Notities |
---|---|
add |
Voeg een eigenschap of matrixelement toe. Voor bestaande eigenschap: waarde instellen. |
remove |
Een eigenschap of matrixelement verwijderen. |
replace |
Hetzelfde als remove gevolgd door add op dezelfde locatie. |
move |
Hetzelfde als remove van de bron, gevolgd door add naar bestemming met behulp van de waarde uit de bron. |
copy |
Hetzelfde als add naar bestemming met behulp van waarde uit de bron. |
test |
Retourneer de successtatuscode als de waarde op path = aangegeven value . |
JSON Patch in ASP.NET Core: Een inleiding
De ASP.NET Core-implementatie van JSON Patch is beschikbaar in het Microsoft.AspNetCore.JsonPatch NuGet-pakket.
Code van actiemethode
In een API-controller, een actiemethode voor JSON Patch:
- Wordt geannoteerd met het kenmerk
HttpPatch
. - Accepteert een
JsonPatchDocument<T>
, meestal met[FromBody]
. - Roept
ApplyTo
aan in het patchdocument om de wijzigingen toe te passen.
Hier volgt een voorbeeld:
[HttpPatch]
public IActionResult JsonPatchWithModelState(
[FromBody] JsonPatchDocument<Customer> patchDoc)
{
if (patchDoc != null)
{
var customer = CreateCustomer();
patchDoc.ApplyTo(customer, ModelState);
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return new ObjectResult(customer);
}
else
{
return BadRequest(ModelState);
}
}
Deze code van de voorbeeld-app werkt met het volgende Customer
model:
using System.Collections.Generic;
namespace JsonPatchSample.Models
{
public class Customer
{
public string CustomerName { get; set; }
public List<Order> Orders { get; set; }
}
}
namespace JsonPatchSample.Models
{
public class Order
{
public string OrderName { get; set; }
public string OrderType { get; set; }
}
}
De voorbeeldactiemethode:
- Maakt een
Customer
. - Past de patch toe.
- Retourneert het resultaat in de hoofdtekst van het antwoord.
In een echte app haalt de code de gegevens op uit een archief, zoals een database, en werkt de database bij nadat de patch is toegepast.
Modeltoestand
In het voorgaande voorbeeld van de actiemethode wordt een overbelasting van ApplyTo
aangeroepen die de modelstatus als een van de parameters gebruikt. Met deze optie kunt u foutberichten in antwoorden krijgen. In het volgende voorbeeld ziet u de body van een 400 Bad Request-reactie binnen een test
-bewerking:
{
"Customer": [
"The current value 'John' at path 'customerName' is not equal to the test value 'Nancy'."
]
}
Dynamische objecten
In het volgende voorbeeld van een actiemethode ziet u hoe u een patch toepast op een dynamisch object:
[HttpPatch]
public IActionResult JsonPatchForDynamic([FromBody]JsonPatchDocument patch)
{
dynamic obj = new ExpandoObject();
patch.ApplyTo(obj);
return Ok(obj);
}
De toevoegbewerking
- Als
path
verwijst naar een matrixelement: voegt nieuw element in vóór het element dat is opgegeven doorpath
. - Als
path
verwijst naar een eigenschap: stelt de eigenschapswaarde in. - Als
path
verwijst naar een niet-bestaande locatie:- Als de resource die moet worden gepatcht een dynamisch object is: voegt een eigenschap toe.
- Als de resource om te patchen een statisch object is: de aanvraag mislukt.
In het volgende voorbeeldpatchdocument wordt de waarde van CustomerName
ingesteld en wordt een Order
-object toegevoegd aan het einde van de Orders
-matrix.
[
{
"op": "add",
"path": "/customerName",
"value": "Barry"
},
{
"op": "add",
"path": "/orders/-",
"value": {
"orderName": "Order2",
"orderType": null
}
}
]
De verwijderbewerking
- Als
path
verwijst naar een matrixelement: verwijdert het element. - Als
path
verwijst naar een eigenschap:- Wanneer de resource die gepatcht moet worden een dynamisch object is, wordt de eigenschap verwijderd.
- Als de resource om te patchen een statisch object is:
- Als de eigenschap nullable is: stelt deze in op null.
- Als de eigenschap niet nullbaar is, stelt u deze in op
default<T>
.
De volgende voorbeeldpatchdocumenten stellen CustomerName
in op null en verwijderen Orders[0]
:
[
{
"op": "remove",
"path": "/customerName"
},
{
"op": "remove",
"path": "/orders/0"
}
]
De vervangingsbewerking
Deze bewerking is functioneel hetzelfde als een remove
gevolgd door een add
.
In het volgende voorbeeldpatchdocument wordt de waarde van CustomerName
ingesteld en wordt Orders[0]
vervangen door een nieuw Order
-object:
[
{
"op": "replace",
"path": "/customerName",
"value": "Barry"
},
{
"op": "replace",
"path": "/orders/0",
"value": {
"orderName": "Order2",
"orderType": null
}
}
]
De verplaatsingsbewerking
- Als
path
verwijst naar een matrixelement: kopieertfrom
element naar de locatie vanpath
element en voert vervolgens eenremove
bewerking uit op hetfrom
element. - Als
path
verwijst naar een eigenschap: kopieert de waarde vanfrom
eigenschap naarpath
eigenschap en voert vervolgens eenremove
bewerking uit op de eigenschapfrom
. - Als
path
verwijst naar een niet-bestaande eigenschap:- Als de resource om te patchen een statisch object is: de aanvraag mislukt.
- Als de resource die moet worden gepatcht een dynamisch object is: kopieert
from
eigenschap naar de locatie aangegeven doorpath
en voert vervolgens eenremove
bewerking uit op de eigenschapfrom
.
Het volgende voorbeeldpatchdocument:
- Kopieert de waarde van
Orders[0].OrderName
naarCustomerName
. - Hiermee stelt u
Orders[0].OrderName
in op null. - Hiermee verplaatst u
Orders[1]
naar vóórOrders[0]
.
[
{
"op": "move",
"from": "/orders/0/orderName",
"path": "/customerName"
},
{
"op": "move",
"from": "/orders/1",
"path": "/orders/0"
}
]
De kopieerbewerking
Deze bewerking is functioneel hetzelfde als een move
bewerking zonder de laatste remove
stap.
Het volgende voorbeeldpatchdocument:
- Kopieert de waarde van
Orders[0].OrderName
naarCustomerName
. - Voeg een kopie van
Orders[1]
voorOrders[0]
in.
[
{
"op": "copy",
"from": "/orders/0/orderName",
"path": "/customerName"
},
{
"op": "copy",
"from": "/orders/1",
"path": "/orders/0"
}
]
De testbewerking
Als de waarde op de locatie die wordt aangegeven door path
verschilt van de waarde in value
, mislukt de aanvraag. In dat geval mislukt de hele PATCH-aanvraag, zelfs als alle andere bewerkingen in het patchdocument anders zouden slagen.
De test
bewerking wordt vaak gebruikt om een update te voorkomen wanneer er een gelijktijdigheidsconflict is.
Het volgende voorbeeldpatchdocument heeft geen effect als de initiële waarde van CustomerName
'John' is, omdat de test mislukt:
[
{
"op": "test",
"path": "/customerName",
"value": "Nancy"
},
{
"op": "add",
"path": "/customerName",
"value": "Barry"
}
]
De code ophalen
voorbeeldcode weergeven of downloaden. (Hoe te downloaden).
Als u het voorbeeld wilt testen, voert u de app uit en verzendt u HTTP-aanvragen met de volgende instellingen:
- URL:
http://localhost:{port}/jsonpatch/jsonpatchwithmodelstate
- HTTP-methode:
PATCH
- Koptekst:
Content-Type: application/json-patch+json
- Hoofdtekst: Kopieer en plak een van de voorbeelden van JSON-patchdocumenten uit de JSON- projectmap.