私は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ではここで選択できません。または私はできますか?