將 REST Web Service 變更為使用 Action-Based Routing 方式處理路由
在 Tip 2 的圖中,紅色框住的 URI 是要順便指出,這個畫蛇添足版的 Web API 方法名稱是 HandMadeJson,它和先前的 Get() 一樣是 TestJsonController 的成員。
可是如果沒有額外動手腳,用戶端在存取 http://HostName/api/TestJson/HandMadeJson 這樣的 URI 時,仍然會由預設的 Get 方法來服務,而不會派送給 HandMadeJson。這是 routing 設定的緣故,把 App_Start\WebApiConfig.cs 裡面的 Register 方法稍微改一下就行了:
原本的 MapHttpRoute() 呼叫所傳入的 routeTemplate 參數是 "api/{controller}/{id}",現在只是在中間多加了一個 "action" 而已。這種 routing 方式叫做 action-based routing。
加了一層 action 的路徑,可以讓 Web API 不受限於 Get、Post、Put、Delete 等 HTTP 動作方法的命名規則,提供更大的彈性,就好像在寫傳統的 Web service 或 HTTP Handler 那樣,可以自訂動作名稱。不過,這好像就不是純正的 REST 了?這點對我來說倒不是問題。
資料來源: https://www.huanlintalk.com/2013/01/aspnet-web-api-and-json.html
可是如果沒有額外動手腳,用戶端在存取 http://HostName/api/TestJson/HandMadeJson 這樣的 URI 時,仍然會由預設的 Get 方法來服務,而不會派送給 HandMadeJson。這是 routing 設定的緣故,把 App_Start\WebApiConfig.cs 裡面的 Register 方法稍微改一下就行了:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional } ); var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"); config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType); } }
原本的 MapHttpRoute() 呼叫所傳入的 routeTemplate 參數是 "api/{controller}/{id}",現在只是在中間多加了一個 "action" 而已。這種 routing 方式叫做 action-based routing。
加了一層 action 的路徑,可以讓 Web API 不受限於 Get、Post、Put、Delete 等 HTTP 動作方法的命名規則,提供更大的彈性,就好像在寫傳統的 Web service 或 HTTP Handler 那樣,可以自訂動作名稱。不過,這好像就不是純正的 REST 了?這點對我來說倒不是問題。
資料來源: https://www.huanlintalk.com/2013/01/aspnet-web-api-and-json.html
留言
張貼留言