1

私はRESTAPIを書いていますが、次の問題があります。

リソース/messages/を使用して、MessageControllerに次のメソッドがあります。

[HttpGet]
// retrieves all messages for a user
public HttpResponseMessage GetMessages(Guid RecordId) {}

[HttpGet]
// retrieves only a single messages, specified by guid
public HttpResponseMessage GetMessage(Guid RecordId) {}

私のWebApiConfig.csには、次のルーティングがあります。

config.Routes.MapHttpRoute(
    name: "MessageRouting",
    routeTemplate: "messages/{RecordId}/",
    defaults: new { controller = "Message", RecordId= RouteParameter.Optional }
);

もちろん、ルーティングはどのメソッドを呼び出すかを知らないため、これは失敗します。ここでの問題は、RESTfulを維持するために、次のような追加のクエリパラメータを使用しないようにすることです。

GET /messages/?userid=1

AccessTokenからuserIdをプルして、次のようにGetMessagesを呼び出す必要がありますか?

GET /messages
AccessToken=foo

[HttpPost]と[HttpPut]を使用しても同じ問題が発生します。常にコレクション、または操作する単一のアイテムがあるため、Httpメソッドごとに少なくとも2つのメソッドを呼び出す必要があります。 。

GetMessages()メソッドをUserControllerに移動するオプションはありません。同じ問題が発生するためです。WebApiでは、コントローラーは各HTTPメソッドを1回しか定義できないようです。コレクションと単一のアイテムを扱うのはひどく難しいです。

私はRESTfulを維持することと、URLがリソースを一意に識別することとの間で少し混乱していますが、ルーティングでHTTPメソッドを指定できないため、.NETではここで選択できません。または私はできますか?

4

1 に答える 1

3

解決策が見つかりました-WebApiConfig.csで、ルートの「name」属性を指定できます。この属性は、次のようなメソッドに注釈を付けるために使用できます。

public class MessageController() {

    [ActionName("MultipleMessages")]
    [HttpGet]
    public HttpResponseMessage GetMessages(Guid UserId) {}

    [ActionName("SingleMessage")]
    [HttpGet]
    public HttpResponseMessage GetMessage(Guid MessageId) {}

}

そうすれば、同じコントローラーに複数のGETメソッドまたはPOSTメソッドを含めることができます。これらのメソッドを呼び出すルートは次のようになります。

// multiple messages, will call MessageController.GetMessages()
config.Routes.MapHttpRoute(
    name: "MultipleMessages",
    routeTemplate: "users/{UserId}/messages",
    defaults: new { controller = "Message", UserId = RouteParameter.Optional }
);

// single messages, will call MessageController.GetMessage()
config.Routes.MapHttpRoute(
    name: "SingleMessage",
    routeTemplate: "messages/{MessageId}/",
    defaults: new { controller = "Message", MessageId = RouteParameter.Optional }
);
于 2012-09-11T10:15:28.137 に答える