WebAPI学习笔记
WebAPI
WebApi是添加到Asp.Net平台的一个新特性,可以快速的创建Web服务,并对客户端提供HTTP的API调用接口
WebApi是建立在MVC框架基础之上,但不属于MVC的一部分。
序章
Http从一开始就定义了一个范围更广的应用程序模型,全面支持与数据的交互和对数据的操控。
但我们实际上的交互,只是Get和Post,只用到了HTTP的一部分功能。
除了经典的GET和POST方法,HTTP还定义了PUT、DELETE、PATCH方法,这就是我们需要使用WebAPI的地方。
利用WebAPI,Web服务器可以提供完整的HTTP应用程序模型,支持对资源的编程访问。
控制器
WebApi特性是在MVC的基础上添加一个特殊的控制器。他有两个明显的特征:
1)动作方法返回的是模型对象,而不是ActionResult对象。
2)动作方法是根据请求所使用的HTTP方法来选择的。
第1很好理解,第2做一下解释。首先我们看一下WebAPI的配置文件。(文件都是由Global.asax,在应用程序启动时进入运行)
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
其中配置路径:"api/{controller}/{id}"。 可以看到,没有action方法。
当一个与WebAPI路由匹配的请求到达应用程序时,动作是通过行程该请求的 HTTP请求方法 来决定的。其中最常用的就是GET 和 POST。
当直接访问网址时,浏览器就会指定GET方法来请求。通过路由可以定位控制器,然后会通过HTTP方法来查找。
在对API的方法进行命名的时候,约定是以它所支持的HTTP方法作为前缀。例如:GetAll()。
或者使用注解属性来实现相同功能,例如添加 [HttpPost] 特性。如果POST请求,则会优先查找此方法。
API控制器的动作方法返回的模型对象被编码成JSON,并发送给客户端。不支持视图、布局等特性。
WebAPI控制器,需要继承ApiController。可直接右键添加。
注意:不同浏览器调用方法的时候,会添加不同的请求头。其中Accept报头会返回可接受的数据格式,如其中包含application/xml,则会返回Xml形式的报文。
我们在使用Ajax发送Post请求的时候,一定要注意,Content-Type:application/json (请求类型)和dataType:"Json" (响应类型)。
并且在接受Post请求的时候,需要在参数前面加上FromBody,表示内容从请求正文获取。
FromBody只能定义一个参数,故此如需传递多个参数请进行一下封装处理。
var album = {
AName:"我",
ADate:"2014-08-18",
ASize:,
ALock:true
}; $.ajax({
url:"api/user/po",
type:"post",
data:JSON.stringify(album),
contentType:"application/json",
success:function(data){
console.log(data);
}
}); public class Album
{
......
} public string Po([FromBody]Album po)
{
return "";
}
一个完整的增删改查例子
namespace TodoApip.Controllers
{
[Route("api/[controller]")]
public class TodoController : Controller
{
public ITodoRepository TodoItems { get; set; }
public TodoController(ITodoRepository todoItems)
{
TodoItems = todoItems;
} public IEnumerable<TodoItem> GetAll()
{
return TodoItems.GetAll();
} [HttpGet("{id}")]
public IActionResult GetById(string id)
{
var item = TodoItems.Find(id);
if (item == null)
{
return NotFound();
}
return new ObjectResult(item);
} [HttpPost]
public IActionResult Create([FromBody]TodoItem item)
{
if (item == null)
{
return BadRequest();
}
TodoItems.Add(item);
return CreatedAtRoute("GetTodo", new { controller = "Todo", id = item.Key }, item);
} [HttpPut("{id}")]
public IActionResult Update(string id, [FromBody]TodoItem item)
{
if (item == null || item.Key != id)
{
return BadRequest();
}
var todo = TodoItems.Find(id);
if (todo == null)
{
return NotFound();
}
TodoItems.Update(item);
return new NoContentResult();
} [HttpDelete("{id}")]
public void Delete(string id)
{
TodoItems.Remove(id);
}
}
}
¥
WebAPI学习笔记的更多相关文章
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换
路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(九)-- 单元测试
本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json 文件内容, ...
- 输出的数据格式是如何决定的-------Asp.net WebAPI学习笔记(二)
在上一篇文章<路由其实也可以很简单>,我们解决了路由问题,这篇文章,我们来研究剩下的另一个问题,为何我们的方法返回的是一个列表,输出到客户端的时候,变成json呢,大家应该还记得我们上一篇 ...
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)
MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中,一切皆路由,url中是完全拒绝"?"和“&”.对此,我 ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(十)-- 发布(Windows)
本篇将在这个系列演示的例子上继续记录Asp.Net Core在Windows上发布的过程. Asp.Net Core在Windows上可以采用两种运行方式.一种是自托管运行,另一种是发布到IIS托管运 ...
- Restful和WeBAPI学习笔记
1.restful是基于无状态的,所谓无状态就是说客户端和服务端的每次通话都是独立的,不存在session和cookie之类的保存状态的机制,基于该协议可实现简单的curd操作, 其操作分为get\p ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发
本篇将演示Asp.Net Core如何在多环境下进行开发适配. 在一个正规的开发流程里,软件开发部署将要经过三个阶段:开发.测试.上线,对应了三个环境:开发.测试.生产.在不同的环境里,需要编写不同的 ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(七)-- 结构化配置
本篇将记录.Net Core里颇有特色的结构化配置的使用方法. 相比较之前通过Web.Config或者App.Config配置文件里使用xml节点定义配置内容的方式,.Net Core在配置系统上发生 ...
随机推荐
- Python 多线程 线程安全、daemon简介 (四)
线程安全 只能在Winodws下的ipython中演示,Python命令行.Pycharm.Mac下的ipython都演示不出效果 import threading def worker(): for ...
- 哈希表和字典List和Ilist和array和arraylist的应用
string x = string.Empty; string y = string.Empty; Hashtable ht = new Hashtable(); ...
- PAT——1034. 有理数四则运算
本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分 ...
- rsync + mysql + gzip + --single-transaction
1.rsync -avz 172.16.2.61:~/vs/program/elasticsearch-5.0.0 --exclude=elasticsearch-5.0.0/data/* ./ 从其 ...
- stateless 无状态组件
使用:
- Template Method(模板方法)模式
1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1: ...
- Oracle特有函数 case when decode exists 分页rownum
select * from EMP eselect * from dept dselect * from salgrade s--Oracle特有函数 case whenselect case 2 w ...
- XML第一次简单入门(Lab分析)
In this tutorial you will create a well-formed and verified XML file. Consider the XML document belo ...
- vs code 修改文件的缩进
百度这个问题的都是强迫症患者. 前人代码是2个空格缩进,我习惯3个, step1:打开 文件 —> 首选项 —> 设置,进入用户设置 step2:设置缩进量,(加两句代码) step3 ...
- 帝国CMS给会员注册加入问答验证
修改文件有e/enews/index.php //注册 elseif($enews=="register") { if($_POST['ask']=='帝国软件') { $user ...