2013-01-05 30 views
22

Tôi tự hỏi làm thế nào để thực hiện một phần cập nhật với giao diện RESTful của ASP.NET Web API? Hãy nói rằng ví dụ chúng ta đang truyền đối tượng qua dây dẫn có cấu trúc sau:Cách được khuyến nghị hiện tại để thực hiện cập nhật một phần bằng API Web là gì?

public class Person { 
    public int Id { get; set; } 
    public string Username { get; set; } 
    public string Email { get; set; } 
} 

Làm thế nào một sự ủng hộ sẽ cập nhật chỉ bộ phận của một Person tại một thời điểm, ví dụ như Email bất động sản? Được khuyến khích để thực hiện điều này thông qua OData và động từ PATCH, hoặc nó sẽ là tốt hơn để thực hiện PATCH mình?

+0

HTTP 'PATCH' là – TheWhiteRabbit

Trả lời

30

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

+0

Tôi đã xem OData như một cách để nhận hỗ trợ cho PATCH. Tuy nhiên, có thể chỉ sử dụng Delta + PATCH mà không thực hiện giao thức OData nói chung không? Tôi không quan tâm đến việc tạo một API OData, tôi chỉ muốn hỗ trợ PATCH. – aknuds1

+1

no Delta sẽ không hoạt động nếu không có ODataMediaTypeFormatter, vì vậy bạn cần thêm ít nhất gói oData và cấu hình cuộc gọi.EnableOData (GetEdmModel()); Thông tin thêm tại đây: http://blogs.msdn.com/b/alexj/archive/2012/11/02/odata-in-webapi-microsoft-asp-net-web-api-odata-0-2-0- alpha-release.aspx. –

+0

Nhưng điều này ảnh hưởng đến REST API của tôi như thế nào trong thực tế? Nó có hoạt động theo giao thức OData hay tôi có thể thực hiện PATCH mà không cần điều chỉnh API đã xuất bản của tôi lên OData không? – aknuds1

Các vấn đề liên quan