Không có hỗ trợ nào trong bản phát hành Web API mới nhất ổn định (từ tháng 8 năm 2012). Vì vậy, nếu tất cả những gì bạn muốn sử dụng là Web API RTM, bạn sẽ phải tự mình thực hiện toàn bộ hệ thống ống nước.
Với điều đó đã nói, gói ODer prerelease hỗ trợ cập nhật một phần rất độc đáo thông qua đối tượng Delta<T>
mới. Hiện nay gói Microsoft.AspNet.WebApi.OData là RC phiên bản đã (0.3) và có thể thu được từ đây: http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData
Sau khi cài đặt, bạn có thể sau đó sử dụng cho phù hợp:
[AcceptVerbs("PATCH")]
public void Patch(int id, Delta<Person> person)
{
var personFromDb = _personRepository.Get(id);
person.Patch(personFromDb);
_personRepository.Save();
}
và bạn muốn gọi nó là từ khách hàng như thế này:
$.ajax({
url: 'api/person/1',
type: 'PATCH',
data: JSON.stringify(obj),
dataType: 'json',
contentType: 'application/json',
success: function(callback) {
//handle errors, do stuff yada yada yada
}
});
Ưu điểm rõ ràng của việc này là nó làm việc cho bất kỳ tài sản, và bạn không cần phải quan tâm đến việc bạn cập nhật Email
hoặc Username
hoặc không có gì.
Bạn cũng có thể muốn nhìn vào bài viết này, vì nó cho thấy một kỹ thuật rất giống http://techbrij.com/http-patch-request-asp-net-webapi
EDIT (thêm thông tin): Để chỉ cần sử dụng PATCH, bạn không cần phải kích hoạt bất kỳ điều gì liên quan đến OData, ngoại trừ việc thêm gói OData - để truy cập vào đối tượng Delta<TEntityType>
.
Sau đó bạn có thể làm điều này:
public class ValuesController : ApiController
{
private static List<Item> items = new List<Item> {new Item {Id = 1, Age = 1, Name = "Abc"}, new Item {Id = 2, Age = 10, Name = "Def"}, new Item {Id = 3, Age = 100, Name = "Ghj"}};
public Item Get(int id)
{
return items.Find(i => i.Id == id);
}
[AcceptVerbs("PATCH")]
public void Patch(int id, Delta<Item> item)
{
var itemDb = items.Find(i => i.Id == id);
item.Patch(itemDb);
}
}
Nếu mục của bạn, hãy nói:
{
"Id": 3,
"Name": "hello",
"Age": 100
}
Bạn có thể vá để /api/values/3
với:
{
"Name": "changed!"
}
và điều đó sẽ đúng cập nhật đối tượng của bạn.
Delta<TEntity>
sẽ theo dõi các thay đổi cho bạn. Đây là lớp động có vai trò như một proxy nhẹ cho Loại của bạn và sẽ hiểu sự khác biệt giữa đối tượng gốc (ví dụ: từ DB) và đối tượng được truyền bởi ứng dụng khách.
Điều này S affect KHÔNG ảnh hưởng đến phần còn lại của API của bạn theo bất kỳ cách nào (ngoại trừ khóa học thay thế các tệp DLL bằng các phiên bản mới hơn để tạo điều kiện cho gói phụ thuộc OData).
Tôi đã thêm dự án mẫu để minh họa công việc của PATCH + Delta - bạn có thể lấy nó tại đây (nó.s VS2012) https://www.dropbox.com/s/hq7wt3a2w84egbh/MvcApplication3.zip
HTTP 'PATCH' là – TheWhiteRabbit