Web APIの現在の最新の安定したリリース(2012年8月以降)ではサポートがありません。したがって、使用したいのがWeb API RTMだけの場合は、配管全体を自分で実装する必要があります。
そうは言っても、ODataプレリリースパッケージは、新しいDelta<T>
オブジェクトを介した部分的な更新を非常にうまくサポートします。現在、Microsoft.AspNet.WebApi.ODataパッケージはすでにRCバージョン(0.3)であり、 http://www.nuget.org/packages/Microsoft.AspNet.WebApi.ODataから入手できます。
それをインストールすると、それに応じてそれを使用できます。
[AcceptVerbs("PATCH")]
public void Patch(int id, Delta<Person> person)
{
var personFromDb = _personRepository.Get(id);
person.Patch(personFromDb);
_personRepository.Save();
}
そして、あなたはこのようにクライアントからそれを呼び出すでしょう:
$.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
}
});
Email
これの明らかな利点は、どのプロパティでも機能することであり、更新するかどうかを気にする必要はありませんUsername
。
http://techbrij.com/http-patch-request-asp-net-webapi非常によく似た手法を示しているため、この投稿も調べてみてください。
編集(詳細):PATCHを使用する
ために、Delta<TEntityType>
オブジェクトにアクセスするためにODataパッケージを追加することを除いて、ODataに関連するものを有効にする必要はありません 。
次に、これを行うことができます。
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);
}
}
あなたのアイテムがそうであるならば、言いましょう:
{
"Id": 3,
"Name": "hello",
"Age": 100
}
あなたはでパッチを当てることができます/api/values/3
:
{
"Name": "changed!"
}
これでオブジェクトが正しく更新されます。
Delta<TEntity>
変更を追跡します。これは、Typeの軽量プロキシとして機能する動的クラスであり、元のオブジェクト(つまり、DBからのオブジェクト)とクライアントから渡されたオブジェクトの違いを理解します。
これは、APIの残りの部分にはまったく影響しません(もちろん、ODataパッケージの依存関係を容易にするためにDLLを新しいものに置き換えることを除いて)。
PATCH + Deltaの動作を示すサンプルプロジェクトを追加しました-ここで入手できます(it.s VS2012)https://www.dropbox.com/s/hq7wt3a2w84egbh/MvcApplication3.zip