22

ASP.NET Web API の RESTful インターフェイスを使用して部分的な更新を実装する方法を知りたいですか? たとえば、次の構造のワイヤを介してオブジェクトを渡しているとします。

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

プロパティPersonなど、一度に の一部だけを更新するにはどうすればよいでしょうか? ODataEmailと PATCH 動詞を介してこれを実装することをお勧めしますか、それとも PATCH 自体を実装する方がよいでしょうか?

4

1 に答える 1

31

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

于 2013-01-08T16:19:24.777 に答える