Asp.Net Core WebAPI入门整理(二)简单示例
一、Core WebAPI中的序列化
使用的是Newtonsoft.Json,自定义全局配置处理:
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { //使用IMvcBuilder 配置Json序列化处理 services.AddMvc() .AddJsonOptions(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); options.SerializerSettings.DateFormatString = "yyyy-MM-dd"; }); }
二、Core WebAPI中的路由处理使用方法注释的方式处理,
控制器路由:[Route("api/Menu")]
Action路由:1.根据HttpMethod路由 [HttpPut] 2.根据Template模板路由[HttpGet("{id}")]
Core WebAPI中返回数据处理,提供了更 多的选择:
1.OKResult,OkObjectResult,返回状态为200
注:用OkObjectResult 前台jquery自动解析为object对象,不需要进行反序列化处理
2.ContentResult 返回字符串
3.JsonResult 返回Json对象,前台不需要反序列化处理
4.返回基础类型和引用类型 ,自动序列化,前台接收为object对象等
三 、根据HttpMethod路由示例
1.API定义
/* * API 定义如下 * GET api/menu 获取菜单列表 * POST api/menu 添加模块 * PUT api/menu 修改模块 * PATCH api/menu 修改菜单信息 * DELETE api/menu 删除模块 */
2.后台代码 :
MenuModelContext _Context = new MenuModelContext(); /// <summary> /// 获取列表 /// </summary> /// <returns></returns> [HttpGet] public IEnumerable<Menu> Get() { List<Menu> list = _Context.Menu.ToList(); return list; } /// <summary> /// 添加模块对象 /// </summary> /// <param name="m"></param> /// <returns></returns> [HttpPost] public bool Add(Model m) { try { m.AddTime = DateTime.Now; _Context.Model.Add(m); _Context.SaveChanges(); return true; } catch (Exception ex) { return false; } } /// <summary> /// 修改模块 /// </summary> /// <param name="m"></param> /// <returns></returns> [HttpPut] public bool Update(Model m) { try { Model oldModel = _Context.Model.Find(m.ModelId); oldModel.ModelName = m.ModelName; oldModel.SortNumber = m.SortNumber; _Context.SaveChanges(); return true; } catch (Exception ex) { return false; } } /// <summary> /// 修改菜单对象 /// </summary> /// <param name="m"></param> /// <returns></returns> [HttpPatch] public IActionResult Update(Menu m) { try { Menu oldMenu = _Context.Menu.Find(m.MenuId); if (oldMenu == null) return NotFound("你要访问的菜单不存在或已经删除"); oldMenu.MenuName = m.MenuName; oldMenu.SortNumber = m.SortNumber; oldMenu.ModelId = m.ModelId; _Context.SaveChanges(); return Ok(); } catch (Exception ex) { return Content(ex.Message); } } /// <summary> /// 删除模块 /// </summary> /// <param name="ids"></param> /// <returns></returns> [HttpDelete] public IActionResult Delete(string ids) { try { if (string.IsNullOrEmpty(ids)) throw new Exception("获取id参数失败"); List<int> idList = ids.Split(',').Select(q => Convert.ToInt32(q)).ToList(); List<Model> list = _Context.Model.Where(q => idList.Contains(q.ModelId)).ToList(); _Context.Model.RemoveRange(list); int count = _Context.SaveChanges(); //使用OkObjectResult 前台jquery自动解析为object对象,不需要进行反序列化处理 //返回的不是字符串 return Ok(new { msg = $"删除成功,总共删除{count}条数据" }); } catch (Exception ex) { //使用ContentResult返回字符串处理 return Content(ex.Message); } }
3.jQuery ajax代码
//Get获取列表数据 function testOne() { $.get(urlHelper.getApi('menu'), {}, function (data) { console.info(data); var menu1 = new Vue({ el: '#menu1', data: { result: data } }); }) } testOne(); //添加菜单 var example2 = new Vue({ el: '#example-2', data: { name:'添加菜单' }, //在 methods 对象中定义方法 methods: { addMenu: function (event) { //使用 Post提交添加菜单 var _this = this; this.name = '正在提交...'; $.post(urlHelper.getApi('menu'), { ModelName: '测试菜单5', SortNumber:5 }, function (data) { console.info(data); _this.name = '提交成功'; }); }, updateModel: function (event) { //使用put提交修改模块 var _this = this; $.ajax({ url: urlHelper.getApi('menu'), type: 'put', data: { ModelId: '4', ModelName: '模块abc', SortNumber: 4 }, success: function (data) { console.info(data); if (data == true) alert('修改成功'); else alert('修改失败'); } }); } } }); //修改菜单、删除模块 var btngroup1 = new Vue({ el: '#btngroup1', data: { name: '修改菜单', name1: '删除模块' }, methods: { updateMenu: function (e) { var _this = this; //使用patch 方式修改菜单 $.ajax({ url: urlHelper.getApi('menu'), type:'patch', data: { MenuID: 1, MenuName: '测试菜单One', SortNumber: 100, ModelID:2 }, success: function (data) { console.info(data); } }); }, deleteMenu: function (e) { //使用delete 提交方式删除模块 $.ajax({ url: urlHelper.getApi('menu'), type: 'delete', data: { ids:[1003] }, success: function (data) { console.info(data); }, error: function (data) { console.info(data); } }); } } });
四、根据HttpMethod的Template路由示例
1.API定义
/* * API 定义 * GET api/menu/{id} 获取指定ID的菜单对象 * GET api/menu/getmodel 获取模块列表内容 */
2.后台代码:
[HttpGet("{id}")] public IActionResult Get(int ID) { Menu m = _Context.Menu.Find(ID); if (m == null) return NotFound(); return Json(m); } //特别说明:路由中的Template的值不可以包含斜杠/ [HttpGet("getmodel")] public IActionResult GetModel() { List<Model> list = _Context.Model.ToList(); return Json(list); }
3.Jquery 的ajax代码
//其他Get方式测试 var btngroup2 = new Vue({ el: '#btngroup2', data: { name: '获取菜单对象', name1: '获取模块列表', item: {} //Vue的对象绑定,没有的情况下需要一个空对象,不然报错 }, methods: { getMenu: function (e) { var _this = this; //链接地址格式 :http://localhost:50000/api/menu/1/ $.get(urlHelper.getApi('menu','1'), { }, function (data) { console.info(data); _this.item = data; }); }, getModel: function (e) { var _this = this; $.get(urlHelper.getApi('menu', 'getmodel'), {}, function (data) { console.info(data); }) } } });
更多参考: