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有哪些特点:
- 基于“资源”,数据也好、服务也好,在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);
}
}
}
ASP.NET CORE系列【五】webapi整理以及RESTful风格化的更多相关文章
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- asp.net core系列 38 WebAPI 返回类型与响应格式--必备
一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...
- asp.net core系列 36 WebAPI 搭建详细示例
一.概述 HTTP不仅仅用于提供网页.HTTP也是构建公开服务和数据的API强大平台.HTTP简单灵活且无处不在.几乎任何你能想到的平台都有一个HTTP库,因此HTTP服务可以覆盖广泛的客户端,包括浏 ...
- asp.net core 系列之webapi集成EFCore的简单操作教程
因为官网asp.net core webapi教程部分,给出的是使用内存中的数据即 UseInMemoryDatabase 的方式, 这里记录一下,使用SQL Server数据库的方式即 UseSql ...
- asp.net core系列 37 WebAPI 使用OpenAPI (swagger)中间件
一.概述 在使用Web API时,对于开发人员来说,了解其各种方法可能是一项挑战.在ASP.NET Core上,Web api 辅助工具介绍二个中间件,包括:Swashbuckle和NSwag .NE ...
- asp.net core 系列之webapi集成Dapper的简单操作教程
Dapper也是是一种ORM框架 这里记录下,使用ASP.NET 集成 Dapper 的过程,方便自己查看 至于Dapper的特性以及操作可以参考Dapper官方文档 1.创建数据库相关 在Sql S ...
- asp.net core系列 77 webapi响应压缩
一.介绍 背景:目前在开发一个爬虫框架,使用了.net core webapi接口作为爬虫调用入口,在调用 webapi时发现爬虫耗时很短(1秒左右),但客户端获取响应时间却在3~4秒.对于这个问题考 ...
- asp.net core系列 WebAPI 作者:懒懒的程序员一枚
asp.net core系列 36 WebAPI 搭建详细示例一.概述1.1 创建web项目1.2 添加模型类1.3 添加数据库上下文1.4 注册上下文1.5 添加控制器1.6 添加Get方法1.7 ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
随机推荐
- django初探-创建简单的博客系统(二)
上篇django初探-创建简单的博客系统(一)已经记录了Django实现博客的发布的整个过程,接下来继续说明博客标题和内容的显示. 显示博客详细 将博客内容保存到数据库还不是发布博客的终极目的,博客一 ...
- mysql limit 接收变量
参考文章:https://blog.csdn.net/ljz2009y/article/details/7887743 PREPARE s1 FROM 'SELECT * FROM t LIMIT ? ...
- 【Python】 配置解析ConfigParser & 命令行参数解析optparser
ConfigParser ConfigParser包装了配置文件的读取和写入,使得python程序可以更加轻松操作配置文件了.这里的配置文件是指.ini的那种文件,基本格式如下 [section_a] ...
- 文献管理工具的使用(Mendeley和Endnote)
以前是Mendeley的忠诚用户,但是最近在linux平台下出现的bug使我非常崩溃,之前辛辛苦苦整理的文献和分组,分分钟灰飞烟灭.所以希望能转用一个至少比较稳定的文献管理软件.刚好手头上有Mac版的 ...
- Django+xadmin打造在线教育平台(十)
十四.xadmin的进阶开发 14.1.权限管理 (1)用户权限 超级用户拥有所有权限,其它添加的用户默认没有任何权限 进后台添加一个用户“Editor1”,勾上“职员状态”后,这个用户才可以登录进后 ...
- Beta阶段敏捷冲刺报告-DAY2
Beta阶段敏捷冲刺报告-DAY2 Scrum Meeting 敏捷开发日期 2017.11.3 会议时间 13:00 会议地点 微信群 参会人员 项目组全体成员 会议内容 打包问题修复, 爬虫优化, ...
- MySQL 服务安装及命令使用
MySQL 服务安装及命令使用 课程来源说明 本节实验后续至第17节实验为本课程的进阶篇,都基于 MySQL 官方参考手册制作,并根据实验楼环境进行测试调整改编.在此感谢 MySQL 的开发者,官方文 ...
- pickle使用及案例
一.字典格式数据源写入数据库文件 #!/usr/bin/env python # -*- coding:utf-8 -*- import pickle accounts ={1000:'alex', ...
- ASCII排序
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输 ...
- Comet之SSE(Server - Sent - Envent,服务器发送事件)
1.SSE API 先要创建一个新的EventSource对象,并传进一个入口点: var source = new EventSource("myenvent.php"); △: ...