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 ...
随机推荐
- 笔记:Spring Cloud Eureka 高可用注册中心
在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署,对与微服务和服务注册中心都需要高可用部署,Eureka 高可用实际上就是将自己作为服务向其 ...
- NodeJs的async
async.auto最强大的一个api,它适合逻辑复杂的代码,代码中你一部分需要串行,两部分相互依赖,一部分又需要并行,代码中不需要依赖,这个时候你就可以通过auto随性所欲控制你的代码逻辑. var ...
- 2.java.util.logging.Logger使用详解
一.java.util.logging.Logger简介 java.util.logging.Logger不是什么新鲜东西了,1.4就有了,可是因为log4j的存在,这个logger一直沉默着, 其实 ...
- flex布局简析
最近开始对flex布局进行一个重新的认识. 首先. flex布局适用于所有元素 但是注意一点的就是,一旦父级元素设定flex布局的时候,子元素的传统布局属性, float,clear,vertical ...
- Loadrunner初学
1.创建脚本 启动Vvitrual User Generator 创建脚本 因为我们选择录制页面相关的操作,则选择web(HTTP/HTML) application type 选择是录制浏览器网页还 ...
- 开始补习JavaScript的第一天
JavaScript介绍: ①.JavaScript是一种解释性的,基于对象的脚本语言. ②.JavaScript是一种轻量级的编程语言,可以嵌入到html页面中,由浏览器来解释执行. ③.JavaS ...
- Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁
(1)synchronized 是互斥锁: (2)ReentrantLock 顾名思义 :可重入锁 (3)ReadWriteLock :读写锁 读写锁特点: a)多个读者可以同时进行读b)写者必须互斥 ...
- 云计算之路-阿里云上-容器难容:优化自建 docker swarm 集群的部署
在上周六遭遇阿里云容器服务 swarm 版的故障之后,我们决定还是走自建 docker swarm 之路,只要不是阿里云底层的问题,我们相信会找到办法解决或避开自建 docker swarm 不稳定的 ...
- Error contacting service. It is probably not running.
平台:centos-6.3-i386 jdk-7u51 storm 0.9.1 python 2.6.6 hadoop 1.2.1 运行zookeeperd后显示启动成功: JMX enabled ...
- bzoj千题计划243:bzoj2325: [ZJOI2011]道馆之战
http://www.lydsy.com/JudgeOnline/problem.php?id=2325 设线段树节点区间为[l,r] 每个节点维护sum[0/1][0/1] 从l的A/B区域到r的 ...