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学习笔记的更多相关文章

  1. Asp.Net Core WebApi学习笔记(四)-- Middleware

    Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...

  2. 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换

    路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)   MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...

  3. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(九)-- 单元测试

    本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json 文件内容, ...

  4. 输出的数据格式是如何决定的-------Asp.net WebAPI学习笔记(二)

    在上一篇文章<路由其实也可以很简单>,我们解决了路由问题,这篇文章,我们来研究剩下的另一个问题,为何我们的方法返回的是一个列表,输出到客户端的时候,变成json呢,大家应该还记得我们上一篇 ...

  5. 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)

    MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中,一切皆路由,url中是完全拒绝"?"和“&”.对此,我 ...

  6. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(十)-- 发布(Windows)

    本篇将在这个系列演示的例子上继续记录Asp.Net Core在Windows上发布的过程. Asp.Net Core在Windows上可以采用两种运行方式.一种是自托管运行,另一种是发布到IIS托管运 ...

  7. Restful和WeBAPI学习笔记

    1.restful是基于无状态的,所谓无状态就是说客户端和服务端的每次通话都是独立的,不存在session和cookie之类的保存状态的机制,基于该协议可实现简单的curd操作, 其操作分为get\p ...

  8. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发

    本篇将演示Asp.Net Core如何在多环境下进行开发适配. 在一个正规的开发流程里,软件开发部署将要经过三个阶段:开发.测试.上线,对应了三个环境:开发.测试.生产.在不同的环境里,需要编写不同的 ...

  9. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(七)-- 结构化配置

    本篇将记录.Net Core里颇有特色的结构化配置的使用方法. 相比较之前通过Web.Config或者App.Config配置文件里使用xml节点定义配置内容的方式,.Net Core在配置系统上发生 ...

随机推荐

  1. POJ 3261 Milk Patterns 【后缀数组 最长可重叠子串】

    题目题目:http://poj.org/problem?id=3261 Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Subm ...

  2. 20155203 2016-2017-4 《Java程序设计》第9周学习总结

    20155203 2016-2017-4 <Java程序设计>第9周学习总结 教材学习内容总结 课堂内容 两个类如果有公共的部分要放在父类中,多次复用.当我们用父类或接口去声明对象的引用生 ...

  3. JNI由浅入深_4_JNI基础知识详解

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...

  4. HDU1005 Number Sequence(找规律,周期是变化的)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1005 Number Sequence Time Limit: 2000/1000 MS (Java/O ...

  5. 关于Oracle 数据库死锁 转

    转自 https://zhidao.baidu.com/question/200422068111653165.html 一.数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没 ...

  6. LeetCode39.组合总和 JavaScript

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  7. Linux-- 查看文件 more与其它

    more 翻页查看 用法:more 文件名 nl 显示行号打印(不常用) 1.不打印空白行行号:nl -b t 文件名 类似 cat -b 文件名 2.打印所有行行号:nl -b a 文件名 类似 c ...

  8. [笔记][SQL] 连接join

    在学习菜鸟教程里的MySQL教程时,对左右连接的结果有点不解. 其中有如下两个表: runoob_tbl: +-----------+--------------+---------------+-- ...

  9. 使用VMware安装CentOS7

    以前一直用的CentOS6,这次搭建一套CentOS7. 感觉和6还是有一些差异,在这边记录下. 一.选择典型(推荐): 二.选择安装程序光盘映像文件: 网上有几个版本,mini版,DVD版,不过mi ...

  10. jQuery.validate.js表单验证插件

    jQuery.validate.js表单验证插件的使用 效果: 代码: <!DOCTYPE html> <html lang="en"> <head& ...