2013-01-05 12 views
22

Zastanawiam się, jak zaimplementować częściowe aktualizacje za pomocą interfejsu RESTful interfejsu ASP.NET Web API. Powiedzmy, na przykład mijamy obiekty nad drutu o następującej strukturze:Jaki jest obecnie zalecany sposób wykonywania częściowych aktualizacji za pomocą interfejsu Web API?

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

Jak jedna podpora zaktualizowanie tylko częściami Person naraz, na przykład nieruchomości Email? Czy jest zalecane, aby zaimplementować to poprzez OData i czasownik PATCH, czy byłoby lepiej wdrożyć PATCH się?

+0

HTTP 'PATCH' to – TheWhiteRabbit

Odpowiedz

30

Brak wsparcia w najnowszym, stabilnym wydaniu Web API (od sierpnia 2012). Więc jeśli chcesz korzystać z Web API RTM, musisz sam wdrożyć cały system hydrauliczny.

Z tym, że pakiet wstępnej OData obsługuje bardzo dobrze częściowe aktualizacje poprzez nowy obiekt Delta<T>. Obecnie pakiet Microsoft.AspNet.WebApi.OData jest już w wersji (0.3) i RC można uzyskać tutaj: http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData

Po zainstalowaniu, które można następnie wykorzystać to odpowiednio:

[AcceptVerbs("PATCH")] 
public void Patch(int id, Delta<Person> person) 
{ 
    var personFromDb = _personRepository.Get(id); 
    person.Patch(personFromDb); 
    _personRepository.Save(); 
} 

i można by nazwać od klienta jak ten:

$.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 
    } 
}); 

oczywistą zaletą jest to, że działa dla każdej nieruchomości, a ty nie musisz się martwić, czy aktualizować Email lub Username lub co.

Można również zajrzeć do tego postu, jak to pokazuje bardzo podobną technikę http://techbrij.com/http-patch-request-asp-net-webapi

edycji (więcej informacji): W celu wystarczy użyć PATCH, nie trzeba, aby umożliwić cokolwiek związanego z OData, oprócz dodania pakietu OData - aby uzyskać dostęp do obiektu Delta<TEntityType>.

Następnie można to zrobić:

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); 
    } 
} 

Jeśli pozycja jest, powiedzmy:

{ 
    "Id": 3, 
    "Name": "hello", 
    "Age": 100 
} 

Można patch /api/values/3 z:

{ 
    "Name": "changed!" 
} 

i że będzie poprawnie zaktualizuj swój obiekt.

Delta<TEntity> będzie śledzić zmiany dla Ciebie. Jest to klasa dynamiczna, która działa jako lekkie proxy dla Twojego Typu i zrozumie różnice między oryginalnym obiektem (tj. Od DB) a tym, który przeszedł przez klienta.

Nie wpłynie to w żaden sposób na resztę interfejsu API (z wyjątkiem oczywiście zastąpienia bibliotek DLL nowszymi w celu ułatwienia zależności od pakietu OData).

Dodałem przykładowy projekt, aby zademonstrować pracę PATCH + Delta - możesz go pobrać tutaj (it.s VS2012) https://www.dropbox.com/s/hq7wt3a2w84egbh/MvcApplication3.zip

+0

Sprawdziłem OData jako sposób uzyskania wsparcia dla PATCH. Czy możliwe jest jednak użycie Delta + PATCH bez implementacji protokołu OData? Nie jestem zainteresowany tworzeniem interfejsu OData API, chcę tylko obsługę PATCH. – aknuds1

+1

no Delta nie będzie działać bez ODataMediaTypeFormatter, więc musisz przynajmniej dodać pakiet oData i wywołać configuration.EnableOData (GetEdmModel()); Więcej informacji: 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

Ale jak to wpływa na moje REST API w praktyce? Czy będzie działać zgodnie z protokołem OData, czy mogę zaimplementować PATCH bez dostosowywania mojego opublikowanego API do OData? – aknuds1

Powiązane problemy