2013-01-05 3 views
22

ASP.NET Web APIのRESTfulインターフェイスで部分的な更新を実装する方法が不思議です。Web APIで部分的な更新を実行するために現在推奨されている方法は何ですか?

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

はどのようにサポートがEmail財産例えば、一度にPersonの部分だけを更新することになりますのは、私たちは次のような構造のワイヤ上のオブジェクトを渡している例えばとしましょうか?これをODataとPATCH動詞で実装することをお勧めしますか、それともPATCHを実装する方がよいでしょうか?

+0

HTTP 'PATCH'それは – TheWhiteRabbit

答えて

30

最新のでは、安定した 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やを更新するかどうかを気にする必要はありません10など。

、それは非常によく似た手法http://techbrij.com/http-patch-request-asp-net-webapi

EDIT(詳細)を示してます。また、この記事に見たいと思うかもしれません:するためには はちょうどPATCHを使用するには、有効にする必要はありませんODataパッケージの追加を除いて、ODataに関連するもの - Delta<TEntityType>オブジェクトへのアクセスを取得します。あなたはこれを行うことができます

:あなたの項目がある場合は

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>あなたの変更を追跡します。これは、あなたのタイプの軽量プロキシとして機能し、元のオブジェクト(つまり、DB)とクライアントが渡したオブジェクトの違いを理解する動的クラスです。

これは他のAPIには何ら影響しません(ただし、ODataパッケージの依存性を促進するためにDLLを新しいものに置き換えることは除きます)。

私はPATCH + Deltaの仕事を実証するためのサンプルプロジェクトを追加しました。ここでそれを取得できます。s VS2012)https://www.dropbox.com/s/hq7wt3a2w84egbh/MvcApplication3.zip

+0

私はPATCHのサポートを得る方法としてODataを調べました。しかし、一般的にODataプロトコルを実装せずにDelta + PATCHを使用することは可能ですか?私はOData APIを作ることに興味がありません。ちょうどPATCHサポートが必要です。 – aknuds1

+1

デルタは、ODataMediaTypeFormatterなしでは機能しません。したがって、少なくともoDataパッケージを追加し、configuration.EnableOData(GetEdmModel())を呼び出す必要があります。詳細はこちら: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

これは実際にREST APIにどのように影響しますか? ODataプロトコルに従って動作するのですか、または公開されたAPIをODataに適合させずにPATCHを実装できますか? – aknuds1

関連する問題