介紹 什麼是RESTful? 這裡不多做贅述,詳情請百度! 哈哈,本來還想巴拉巴拉介紹一些webapi, RESTful的, 還是算了,咱們直接上乾貨!(原因是懶!哈哈) 使用 以前使用過mvc的人對webapi 應該都很熟悉,先看一段熟悉的代碼 大伙發現了什麼沒?跟以往mvc大多數相同,但有些地方 ...
介紹
什麼是RESTful? 這裡不多做贅述,詳情請百度!
哈哈,本來還想巴拉巴拉介紹一些webapi, RESTful的, 還是算了,咱們直接上乾貨!(原因是懶!哈哈)
使用
以前使用過mvc的人對webapi 應該都很熟悉,先看一段熟悉的代碼
大伙發現了什麼沒?跟以往mvc大多數相同,但有些地方不同 ,我們來一起看看有何區別
1.首先SysUsersController上面有一段代碼
[Produces("application/json")] //[Route("api/SysUsers")] [Route("api/[controller]/[action]")] public class SysUsersController : Controller { }
註釋的部分先不管,首先我們接收的json格式內容,然後路由是 api/[controller]/[action]
這種情況我們只需要正常的ajax請求就能訪問到了,
$.ajax({ url:'/api/SysUsers/Login', type: 'POST', contentType: "application/json; charset=utf-8", data: {UserName:'shumin',Password:'123456'}, success: function (data) { if (data.success) { var href = '@Url.Action("Index")?' + new Date().getTime(); window.location.href = href; } else { alert(data.message); } }, error: function () { alert('服務端錯誤'); } });
我們運行一下, 發現拿不到數據,
這是為什麼呢,經過多番嘗試,是前臺http請求不對,因為我們約定的json傳輸,所以數據需要序列化
$.ajax({ url:'/api/SysUsers/Login', type: 'POST', contentType: "application/json; charset=utf-8", data: JSON.stringify({UserName:'shumin',Password:'123456'}), success: function (data) { if (data.success) { var href = '@Url.Action("Index")?' + new Date().getTime(); window.location.href = href; } else { alert(data.message); } }, error: function () { alert('服務端錯誤'); } });
還有一點需要註意的事,ajax預設的
contentType是application/x-www-form-urlencoded
我們需要改成application/json; charset=utf-8
這樣就可以拿到數據了
RESTful
推薦一個關於RESTful的介紹文章 http://www.ruanyifeng.com/blog/2014/05/restful_api
用上面那種方法,會導致URL又臭又長,舉個例子
網站:/get_user?id=3
RESTFul: GET /user/3 (GET是HTTP類型)
以前的時候我們寫http請求,只會用get post兩種,
而註冊對應的資源是user,api如下:
GET /user/:id # 獲取id用戶的信息
POST /user # 創建新的用戶(註冊)
PUT /user/:id # 更新id用戶的信息
DELETE /user/:id # 刪除id用戶(註銷)
我們一起來看看RESTFul API有哪些特點:
- 基於“資源”,數據也好、服務也好,在RESTFul設計里一切都是資源。
- 無狀態。一次調用一般就會返回結果,不存在類似於“打開連接-訪問數據-關閉連接”這種依賴於上一次調用的情況。
- URL中通常不出現動詞,只有名詞
- URL語義清晰、明確
- 使用HTTP的GET、POST、DELETE、PUT來表示對於資源的增刪改查
-
使用JSON不使用XML
我們接著來看一看RESTFul API的一些最佳實踐原則:
- 使用HTTP動詞表示增刪改查資源, GET:查詢,POST:新增,PUT:更新,DELETE:刪除
- 返回結果必須使用JSON
- HTTP狀態碼,在REST中都有特定的意義:200,201,202,204,400,401,403,500。比如401表示用戶身份認證失敗,403表示你驗證身份通過了,但這個資源你不能操作。
這裡直接貼出RESTful的api僅供參考
namespace NetCoreAdmin.Controllers { [Produces("application/json")] [Route("api/SysUsers")] public class SysUsersController : Controller { private readonly EFCoreContext _context; public SysUsersController(EFCoreContext context) { _context = context; } // GET: api/SysUsers [HttpGet] public IEnumerable<SysUser> GetSysUsers() { return _context.SysUsers; } // GET: api/SysUsers/5 [HttpGet("{id}")] public async Task<IActionResult> GetSysUser([FromRoute] int id) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var sysUser = await _context.SysUsers.SingleOrDefaultAsync(m => m.Id == id); if (sysUser == null) { return NotFound(); } return Ok(sysUser); } // PUT: api/SysUsers/5 [HttpPut("{id}")] public async Task<IActionResult> PutSysUser([FromRoute] int id, [FromBody] SysUser sysUser) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (id != sysUser.Id) { return BadRequest(); } _context.Entry(sysUser).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!SysUserExists(id)) { return NotFound(); } else { throw; } } return NoContent(); } // POST: api/SysUsers [HttpPost] public async Task<IActionResult> PostSysUser([FromBody] SysUser sysUser) { if (!ModelState.IsValid) { return BadRequest(ModelState); } _context.SysUsers.Add(sysUser); await _context.SaveChangesAsync(); return CreatedAtAction("GetSysUser", new { id = sysUser.Id }, sysUser); } // DELETE: api/SysUsers/5 [HttpDelete("{id}")] public async Task<IActionResult> DeleteSysUser([FromRoute] int id) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var sysUser = await _context.SysUsers.SingleOrDefaultAsync(m => m.Id == id); if (sysUser == null) { return NotFound(); } _context.SysUsers.Remove(sysUser); await _context.SaveChangesAsync(); return Ok(sysUser); } private bool SysUserExists(int id) { return _context.SysUsers.Any(e => e.Id == id); } } }