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在配置系统上发生 ...
随机推荐
- oracle数据库之用户管理
转载 Oracle创建用户.角色.授权.建表 一.oracle数据库的权限系统分为系统权限与对象权限: 系统权限( database system privilege )可以让用户执行特定的命令集 ...
- python 怎样构造字典格式的数据
#dict()函数的使用 第一种方法l=[('name','xueli'),('age',12)]dd1=dict(l)print dd1#{'age': 12, 'name': 'xueli'} 第 ...
- 洛谷P2336 [SCOI2012]喵星球上的点名(后缀数组+莫队)
我学AC自动机的时候就看到了这题,想用AC自动机结果被学长码风劝退-- 学后缀数组时又看到了这题--那就写写后缀数组做法吧 结果码风貌似比当年劝退我的学长还毒瘤啊 对所有的模式串+询问串,不同串之间用 ...
- Spotlight On Oracle安装和使用
Spotlight On Oracle安装和使用 软件版本:Version: 5.0.1.1022 注册码:063920179532918005749 Site Message:Quest Free ...
- Android自定义控件——有弹性的ListView,ScrollView
上一次我们试验了有弹性的ScrollView.详情 这一次,我们来试验有弹性的ScrollView. 国际惯例,效果图: 主要代码: [java] view plaincopy import andr ...
- C# 中的#if、#elif、#else、#endif等条件编译符号 (转载)
这些是C#中的条件编译符号.这些指令我在项目中遇到过,查过网络,问过人(当然,既不认识大牛,也不认识小牛,所以没什么收获).今天翻看一本资料,有提到这个方面的东西,所以写下来和能看到这篇文章的人一起学 ...
- 树概念及使用connect by进行级联查询
树 树,大家都见过,以这种形式的数据关系,就是树.下面看一张图,了解什么是根节点(树干).节点或分叉.叶(叶节点) connect by 级联查询 connect by可以用于级联查询,常用于对具有树 ...
- 关于@synchronized 比你想知道的还多
如果你曾经使用Objective-C做过并发编程,那你肯定见过@synchronized这个结构.@synchronized这个结构发挥了和锁一样的作用:它避免了多个线程同时执行同一段代码.和使用NS ...
- org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping
org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping 原因:yml文件格式错误,此文件要求严格要求格式 如节 ...
- oracle10g学习笔记
1.简介 1.1.sql:Structured Query Language 结构化查询语言 1.2.windows在目录路径中使用反斜线\,unix和linux使用正斜线/ 1.3.Number(a ...