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 ...
随机推荐
- saltStack 安装部署
1.saltStack 服务架构介绍 SaltStack 是一种基于C/S架构的服务模式,在SaltStack架构中服务器端叫作Master,客户端叫作Minion,传统C/S架构为:客户端发送请求给 ...
- 数据库 --> MySQL存储引擎介绍
MySQL存储引擎介绍 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然 ...
- 大数据 --> Spark和Hadoop作业之间的区别
Spark和Hadoop作业之间的区别 熟悉Hadoop的人应该都知道,用户先编写好一个程序,我们称为Mapreduce程序,一个Mapreduce程序就是一个Job,而一个Job里面可以有一个或多个 ...
- 基于PLC-C#串口通讯,温度检测和转速监控的c#/.Net实现。
我司为五金加工企业,其中有一条喷涂车间和流水线,客户要求能实时监控炉温温度.流水线速,并设置上下限值,达到上下限时报警. 开始考虑过USB的温度采集器,但是却没有找到带USB的光电开关,并且线路长度受 ...
- Hibernate学习(1)- 初识
一.概念引入 1.持久化: 狭义概念:数据存储在物理介质不会丢失. 广义概念:对数据的CRUD操作都叫做持久化. 2.加载: hibernate里,数据从数据库中加载到session. 3.ORM - ...
- 爬虫(scrapy中调试文件)
在项目setting同级目录下创建py文件,代码如下: from scrapy.cmdline import execute import sys import os sys.path.append( ...
- 谁说 JavaScript 简单的?
这里有一些 Javascript初学者应该知道的技巧和陷阱.如果你已经是专家了,顺便温习一下. Javascript也只不过是一种编程语言.怎么可能出错嘛? 1. 你有没有尝试给一组数字排序? Jav ...
- 从零部署Spring boot项目到云服务器(正式部署)
上一篇文章总结了在Linux云服务器上部署Spring Boot项目的准备过程,包括环境的安装配置,项目的打包上传等. 链接在这里:http://www.cnblogs.com/Lovebugs/p/ ...
- 20162330 第10周 MySort实验
关于MySort的进一步实践 课堂作业题目如下: 模拟实现Linux下Sort -t : -k 2的功能.参考Sort的实现.提交码云链接和代码运行截图. import java.util.*; pu ...
- Flask-uploads 简单使用
pip install flask-uploads#先导入次此处需要用到的库: from flask_uploads import UploadSet, IMAGES, configure_uploa ...