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
HTTP 'PATCH' to – TheWhiteRabbit