多個HTTP Post 方法在同一個Web API controller
最近又要開始寫Http服務, 先前在某個route(或說某個Controller)下,只會針對單一種Request內容作處理,這次則設計成在同一個route下處理多種不同的Request。
1. 一開始異想天開的寫個interface 當成POST方法的參數,結果因為送出的Request欄位會超出interface的定義,結果失敗~
2. 接下來也是很天真地寫上兩個POST方法在同一個Controller,結果出現”此route下有兩個POST方法造成無法識別要使用哪個方法” 的錯誤 ~____~
u 打開(App_Start\WebApiConfig.cs),修改WebApi的Route的預設設定:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "Default", id = RouteParameter.Optional });
這邊可以看到我們將原本的Route : api/{controller}/{id}
修改為:api/{controller}/{action}/{id}
另外再加入為了要多個POST方法的Route設定:
config.Routes.MapHttpRoute(
name: "TransApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { action="XXX|YYY|ZZZ" }
);
=> 這邊設定指定的action必須是XXX or YYY or ZZZ or …
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "Default", id = RouteParameter.Optional });
這邊可以看到我們將原本的Route : api/{controller}/{id}
修改為:api/{controller}/{action}/{id}
另外再加入為了要多個POST方法的Route設定:
config.Routes.MapHttpRoute(
name: "TransApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { action="XXX|YYY|ZZZ" }
);
=> 這邊設定指定的action必須是XXX or YYY or ZZZ or …
u 接下來是最麻煩的部分,原本Controller中的所有CRUD方法都必須另外指定Route中的action name,
例如 GET 方法,將action name設定為Default:
[HttpGet,ActionName("Default")]
至於POST方法,就可以用action name區別不同的Route路徑:
[HttpPost,ActionName("XXX")]
public C Post(A item)
{ }
[HttpPost,ActionName("YYY")]
public C Post(B item)
{ }
例如 GET 方法,將action name設定為Default:
[HttpGet,ActionName("Default")]
至於POST方法,就可以用action name區別不同的Route路徑:
[HttpPost,ActionName("XXX")]
public C Post(A item)
{ }
[HttpPost,ActionName("YYY")]
public C Post(B item)
{ }
4. 實際Call http service時,必須以我們新設定的Route的網址,例如假設我們的Controller名稱為ValueController:
http://localhost/MyApi/Value (Get, 沒有影響)
http://localhost/MyApi/Value (Get, 沒有影響)
沒有留言:
張貼留言