web api 2中的多個參數獲取
我想製作一個傳遞 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)這些都將由預設路由記錄處理。