在 WebApiConfig.cs 加入
config.Routes.MapHttpRoute( name: "RPCApi", routeTemplate: "services/{controller}/{action}/{keyword}", defaults: new { keyword = RouteParameter.Optional } );
services 是跟 api 的部分做個區隔,這裡要注意 controller 中的參數名稱也要叫 keyword,另外,因為把 action 加了回來所以方法必須標記使用的是 http get。
[HttpGet] public IHttpActionResult GetFirstProductByKeyword(string keyword) { var product = products.FirstOrDefault((p) => p.Name.Contains(keyword)); if (product == null) { return NotFound(); } return Ok(product); } [HttpGet] public IHttpActionResult FindProductsByKeyword(string keyword) { var resultSet = products.Where((prod) => prod.Name.Contains(keyword)); if (resultSet == null || resultSet.Count() == 0) { return NotFound(); } return Ok<IEnumerable<Product>>(resultSet); }
這樣在 Jquery 處就可以正確取得服務了
var rpc = 'services/products'; ... function formatItem(item) { return item.Name + ': $' + item.Price; } ... function findFirstFitProductByKeyword() { var name = $('#productName').val(); $.getJSON(rpc + '/GetFirstProductByKeyword/' + name) .done(function (data) { $('#displayProduct').text(formatItem(data)); }) .fail(function (jqXHR, textStatus, err) { $('#displayProduct').text('Error: ' + err); }); } ...
完整專案:按我
ref:http://encosia.com/rest-vs-rpc-in-asp-net-web-api-who-cares-it-does-both/
沒有留言:
張貼留言