web-dev-qa-db-ja.com

複数のパラメーターを使用したWeb APIルーティング

次のWeb APIコントローラーのルーティングを行う方法を考えています。

public class MyController : ApiController
{
    // POST api/MyController/GetAllRows/userName/tableName
    [HttpPost]
    public List<MyRows> GetAllRows(string userName, string tableName)
    {
        ...
    }

    // POST api/MyController/GetRowsOfType/userName/tableName/rowType
    [HttpPost]
    public List<MyRows> GetRowsOfType(string userName, string tableName, string rowType)
    {
        ...
    }
}

現時点では、URLにこのルーティングを使用しています。

routes.MapHttpRoute("AllRows", "api/{controller}/{action}/{userName}/{tableName}",
                    new
                    {
                        userName= UrlParameter.Optional,
                        tableName = UrlParameter.Optional
                    });

routes.MapHttpRoute("RowsByType", "api/{controller}/{action}/{userName}/{tableName}/{rowType}",
                    new
                    {
                        userName= UrlParameter.Optional,
                        tableName = UrlParameter.Optional,
                        rowType= UrlParameter.Optional
                    });

ただし、現時点では最初のメソッド(2つのパラメーター)のみが機能しています。私は正しい行ですか、またはURL形式またはルーティングが完全に間違っていますか?ルーティングは私にとって黒魔術のようです...

25
Mourndark

問題はあなたのapi/MyController/GetRowsOfType/userName/tableName/rowType URLは常に最初のルートに一致するため、2番目のルートには到達しません。

単純な修正、最初にRowsByTypeルートを登録します。

15
James

WebApiConfigget(out of control "with何百ものルートが配置されています。

代わりに、私は個人的に Attribute Routing を好みます

POST and GETと混同している

[HttpPost]
public List<MyRows> GetAllRows(string userName, string tableName)
{
   ...
}

HttpPostANDGetAllRows

代わりにこれをしない理由:

[Route("GetAllRows/{user}/{table}")]
public List<MyRows> GetAllRows(string userName, string tableName)
{
   ...
}

または、Route( "PostAllRows"とPostRowsに変更します。実際にGETリクエストを実行しているので、表示するコードが機能するはずです。 、しかしメソッド自体、その名前は好きなものにすることができます。呼び出し元がROUTEのURLに一致する限り、本当に必要な場合はメソッドのGetMyStuffを入れることができます。

更新:

私は実際にexplicitであり、HTTP methods ANDルートパラメータをメソッドパラメータに一致させたい

[HttpPost]
[Route("api/lead/{vendorNumber}/{recordLocator}")]
public IHttpActionResult GetLead(string vendorNumber, string recordLocator)
{ .... }

(ルートleadはメソッド名GetLeadと一致する必要はありませんが、順序を変更することもできますが(例えばrecord recordなど)、同じ名前をルートパラメーターとメソッドパラメーターに保持する必要があります。ルートが反対の場合でも、vendorNumberの前に-私はそれをしません。

ボーナス:ルートでも常に正規表現を使用できるようになりました、例

[Route("api/utilities/{vendorId:int}/{utilityType:regex(^(?i)(Gas)|(Electric)$)}/{accountType:regex(^(?i)(Residential)|(Business)$)}")]
public IHttpActionResult GetUtilityList(int vendorId, string utilityType, string accountType)
    {
50
Tom Stickel