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

简介: 原文:ASP.NET CORE系列【五】webapi整理以及RESTful风格化介绍 什么是RESTful?  这里不多做赘述,详情请百度! 哈哈,本来还想巴拉巴拉介绍一些webapi, RESTful的, 还是算了,咱们直接上干货!(原因是懒!哈哈)   使用 以前使用过mvc的人对w...
原文: 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);
        }
    }
}

 

        

        

目录
相关文章
|
2月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
2月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
32 1
|
3月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
3月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
105 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
44 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
68 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
50 0
|
4月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
4月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
135 0