ASP.NET CORE系列【五】webapi整理以及RESTful風格化


介紹

什么是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有哪些特點:

  1. 基於“資源”,數據也好、服務也好,在RESTFul設計里一切都是資源。
  2. 無狀態。一次調用一般就會返回結果,不存在類似於“打開連接-訪問數據-關閉連接”這種依賴於上一次調用的情況。
  3. URL中通常不出現動詞,只有名詞
  4. URL語義清晰、明確
  5. 使用HTTP的GET、POST、DELETE、PUT來表示對於資源的增刪改查
  6. 使用JSON不使用XML

我們接着來看一看RESTFul API的一些最佳實踐原則:

  1. 使用HTTP動詞表示增刪改查資源, GET:查詢,POST:新增,PUT:更新,DELETE:刪除
  2. 返回結果必須使用JSON
  3. 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);
        }
    }
}

 

        

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM