Asp.net-Web-Api2

web api 2中的多個參數獲取

  • August 6, 2014

我想製作一個傳遞 4 個參數的 web api。

這是我的路線:

       config.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "api/{controller}/{email}/{firstname}/{lastname}/{source}"
       );

這是方法簽名

public string GetId(string email, string firstname, string lastname, string source)

這是呼叫網址

http://fakedomain.com/api/Contacts/GetId?email=user@domain.com&firstname=joe&lastname=shmoe&source=123

我收到 404 錯誤。

如果我在路由配置中將每個參數設置為可選,並為每個參數設置一個預設值,它就會被呼叫。但是,每個參數都獲取預設值,而不是傳遞的值。

我覺得我很接近,我錯過了什麼?

確保您在 WebApiConfig.cs 文件中有預設的 api 路由設置。

public static class WebApiConfig
{
   public static void Register(HttpConfiguration config)
   {
       // Web API configuration and services

       // Web API routes
       config.MapHttpAttributeRoutes();

       config.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "api/{controller}/{id}",
           defaults: new { id = RouteParameter.Optional }
       );

       config.Routes.MapHttpRoute(
       name: "ContactApi",
       routeTemplate: "api/{controller}/{email}/{firstname}/{lastname}/{source}"
       );
   }
}

http://fakedomain.com/api/Contacts/GetId?email=user@domain.com&firstname=joe&lastname=shmoe&source=123

注意:我用 localhost 替換了 fakedomain,它可以工作… (localhost/api/Contacts/GetId?email=user@domain.com&firstname=joe&lastname=shmoe&source=123)

您不需要特殊的路由記錄來處理多個參數。您創建的路由記錄將尋找以下路線

/api/controller/Dan@dan.com/Dan/FunnyLastName/TheCoffeeShop

但是您正在嘗試傳入參數,而不是指定路線。

使用此路由記錄:

config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional, action = "DefaultAction" });

以下 GET 端點:

public HttpResponseMessage Get(int requestId = 0, string userName = null, string departmentName = null, bool includeCompleted = false)
   {
     //code
   }

可能被擊中:

/api/controllername/?requestId=15&username=Dan

要麼

/api/controllername/?departmentName=SoftwareEngineering

或參數的任何其他組合(或沒有參數,因為它們具有預設值)

由於您有一個“命名”操作 (GetId) 而不是預設操作 (GET,POST,PUT..),這會使事情變得有點複雜,您必須制定一個自定義路由來處理操作名稱。以下是我用於自定義操作名稱的內容(此範例中需要 id)

config.Routes.MapHttpRoute("ActionRoute", "api/{controller}/{action}/{id}");

您的端點必須明確接受一個名為“id”的參數

 public HttpResponseMessage LockRequest(int id, bool markCompleted)
   {
       //code
   }

此端點將在以下路線上命中:

/api/controllerName/LockRequest/id?markCompleted=true

遵循 RESTful 規範,最好盡可能遠離自定義操作名稱。大多數時候,您可以擺脫普通的 HTTP 動詞,而只需使用命名操作來操作現有項目(因此在我的範例中需要 ID)。對於您的程式碼,您可能只有兩個 GET 端點,一個使用特定 ID 來獲取項目,一個基於“搜尋參數”返回所有項目(包括 id)。

public HttpResponseMessage Get(int id)
public HttpResponseMessage Get(int requestId = 0, string userName = null, string departmentName = null, bool includeCompleted = false)

這些都將由預設路由記錄處理。

引用自:https://stackoverflow.com/questions/25161665