Метод PATCH - это метод запроса, поддерживаемый протоколом HTTP для внесения частичных изменений в существующий ресурс.Вы можете увидеть некоторые операции JSON Patch:
Добавить
{
"op": "add",
"path": "/a/b",
"value": "foo"
}
Удалить
{
"op": "remove",
"path": "/a/b"
}
Заменить
{
"op": "replace",
"path": "/a/b",
"value": "foo"
}
Копировать
{
"op": "copy",
"from": "/a/b",
"path": "/a/c"
}
Переместить
{
"op": "move",
"from": "/a/b",
"path": "/a/c"
}
Тест
{
"op": "test",
"path": "/a/b",
"value": "foo"
}
В ASP.NET Core вы указываете методы исправления с атрибутом [HttpPatch].Для получения данных в этих методах вы должны использовать JsonPatchDocument<TModel>
существовать в Microsoft.ApsNetCore.JsonPatch
пространстве имен, где TModel
- ваша сущность, которую вы хотите преобразовать в нее.Еще один полезный пакет - AutoMapper.Вы можете установить его из диспетчера пакетов NuGet, как показано ниже:
Install-Package AutoMapper
и сослаться на него в своем контроллере.
Теперь пришло время взглянуть на пример в ASP.NET Core Web API:
public async Task<IActionResult> PartiallyUpdateBook([FromRoute] Guid id, [FromBody] JsonPatchDocument<BookModel> patchDoc)
{
// If the received data is null
if (patchDoc == null)
{
return BadRequest();
}
// Retrieve book from database
var book = await _context.Books.SingleOrDefaultAsync(x => x.Id == id)
// Check if is the book exist or not
if (book == null)
{
return NotFound();
}
// Map retrieved book to BookModel with other properties (More or less with eexactly same name)
var bookToPatch = Mapper.Map<BookModel>(book);
// Apply book to ModelState
patchDoc.ApplyTo(bookToPatch, ModelState);
// Use this method to validate your data
TryValidateModel(bookToPatch);
// If model is not valid, return the problem
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// Assign entity changes to original entity retrieved from database
Mapper.Map(bookToPatch, book);
// Say to entity framework that you have changes in book entity and it's modified
_context.Entry(book).State = EntityState.Modified;
// Save changes to database
await _context.SaveChangesAsync();
// If everything was ok, return no content status code to users
return NoContent();
}