2

このためにasp.net mvc 4を使用してWeb APIを構築しようとしています。Books リソースがあるとします。Get、Post、Delete は問題なく動作しますが、Post の場合は少し混乱します。私が PUT をどのように使用したいかは、CQRS のようなものです。タイトルを更新するためのアクション PUT、著者を更新するための別のアクション PUT、そして本をお気に入りにするための別のアクションです。このすべての PUT アクションは、さまざまなタイプのコマンドでオーバーロードされており、パラメーターは 1 つだけです。このリソースへの PUT リクエストを作成しようとすると、MVC からのルーティングが失敗し、リクエストに一致する複数の PUT アクションがあると表示されます。処理するルーティングを構成する方法を誰かが提案できますか:

public HttpResponseMessage Put(MakeFavorite mf){/*code*/}

public HttpResponseMessage Put(ChangeTitle ct){/*code*/}

public HttpResponseMessage Put(UpdateAuthor ua){/*code*/}
4

2 に答える 2

6

ここでは RPC を適用しないほうがよいと思います。David ソリューションにも RPC アーティファクトがいくつかあります。まず、URI 構造を設計する必要があります。例えば:

/books/{bookId}/favouritestate/{state}  
/books/{bookId}/title/{title}  
/books/{bookId}/author/{author}  

次に、ルーティング テーブルを更新してこれを処理します。

   routes.MapHttpRoute(
                name: "BookTitleApiRoute",
                routeTemplate: "books/{bookId}/title/{title}  ",
                defaults: new {controller = "BookTitleController", title = RouteParameter.Optional}
                );

次に、いくつかのコントローラーを追加します。例えば:

 public class BookTitleController : ApiController
    {
        // GET /books/{bookId}/title/
        public HttpResponseMessage Get(string bookId)
        {
            return your book title
        }
        // PUT /books/{bookId}/title/{title}
        public HttpResponseMessage Put(string bookId,string title)
        {
            update book title and return result
        }

    }

そのようなオブジェクト間の関係を解釈することもできます。

これが ypu が素敵な RESTful API を構築するのに役立つことを願っています =))

于 2012-05-03T18:57:47.667 に答える
0

各関数は実際には互いにあまり関係がないため、各putメソッドを別々のそれぞれのコントローラーに配置してみてください。

public class MakeFavoriteController : ApiController
{
    public HttpResponseMessage Put(MakeFavorite mf)
    {
        // Code
    }
}

public class ChangeTitleController : ApiController
{
    public HttpResponseMessage Put(ChangeTitle ct)
    {
        // Code
    }
}

public class UpdateAuthorController : ApiController
{
    public HttpResponseMessage Put(UpdateAuthor ua)
    {
        // Code
    }
}
于 2012-05-03T18:44:48.537 に答える