介绍

什么是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);
}
}
}

ASP.NET CORE系列【五】webapi整理以及RESTful风格化的更多相关文章

  1. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  2. asp.net core系列 38 WebAPI 返回类型与响应格式--必备

    一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...

  3. asp.net core系列 36 WebAPI 搭建详细示例

    一.概述 HTTP不仅仅用于提供网页.HTTP也是构建公开服务和数据的API强大平台.HTTP简单灵活且无处不在.几乎任何你能想到的平台都有一个HTTP库,因此HTTP服务可以覆盖广泛的客户端,包括浏 ...

  4. asp.net core 系列之webapi集成EFCore的简单操作教程

    因为官网asp.net core webapi教程部分,给出的是使用内存中的数据即 UseInMemoryDatabase 的方式, 这里记录一下,使用SQL Server数据库的方式即 UseSql ...

  5. asp.net core系列 37 WebAPI 使用OpenAPI (swagger)中间件

    一.概述 在使用Web API时,对于开发人员来说,了解其各种方法可能是一项挑战.在ASP.NET Core上,Web api 辅助工具介绍二个中间件,包括:Swashbuckle和NSwag .NE ...

  6. asp.net core 系列之webapi集成Dapper的简单操作教程

    Dapper也是是一种ORM框架 这里记录下,使用ASP.NET 集成 Dapper 的过程,方便自己查看 至于Dapper的特性以及操作可以参考Dapper官方文档 1.创建数据库相关 在Sql S ...

  7. asp.net core系列 77 webapi响应压缩

    一.介绍 背景:目前在开发一个爬虫框架,使用了.net core webapi接口作为爬虫调用入口,在调用 webapi时发现爬虫耗时很短(1秒左右),但客户端获取响应时间却在3~4秒.对于这个问题考 ...

  8. 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 ...

  9. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

随机推荐

  1. 数据库MySQL、redis主从切换shell脚本

    具体源码可找我领取

  2. 以太坊开发DApp入门教程——区块链投票系统(一)

    概述 对初学者,首先要了解以太坊开发相关的基本概念.   学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ruby,Java... 前 ...

  3. python元类理解2

    恩,对元类理解又有新的收获,其实类似于装饰器,只不过装饰器是修饰函数,元类用来定制一个类. 代码如下,这是一个使用了函数做元类传递给类: input: def upper_attr(class_nam ...

  4. OVS常用命令

    添加brideg: sudo ovs-vsctl add-br br0 删除brideg: sudo ovs-vsctl del-br br0 显示bridge: sudo ovs-vsctl sho ...

  5. 201621123031 《Java程序设计》第2周学习总结

    Week02-Java基本语法与类库 1. 本周学习总结 本周讲了Java的基本数据类型,主要分为八类(byte,short,int,long,double,float,char,boolean),其 ...

  6. 亚马逊AWS学习——VPC里面几个概念的关系

    VPC中涉及几个概念: VPC 子网 路由表 Internet网关 安全组 今天来讲讲这几个概念之间的关系. 1. VPC 说的就是VPC,当然VPC范围是最大的,VPC即virtual privat ...

  7. HTTP协议中PUT和POST使用区别

          有的观点认为,应该用POST来创建一个资源,用PUT来更新一个资源:有的观点认为,应该用PUT来创建一个资源,用POST来更新一个资源:还有的观点认为可以用PUT和POST中任何一个来做创 ...

  8. HTML 字符集

    在 HTML 中,正确的字符编码是什么?   HTML5 中默认的字符编码是 UTF-8. 这并非总是如此.早期网络的字符编码是 ASCII 码.后来,从 HTML 2.0 到 HTML 4.01,I ...

  9. 再一次, 不要使用(include/require)_once

    本文地址: http://www.laruence.com/2012/09/12/2765.html 最近关于apc.include_once_override的去留, 我们做了几次讨论, 这个APC ...

  10. django启动uwsgi报错

    查看uwsgi.log *** Starting uWSGI 2.0.17 (64bit) on [Thu Apr 5 17:46:15 2018] *** compiled with version ...