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. office2013密钥

    GYWDG-NMV9P-746HR-Y2VQW-YPXKK6HDB9-BNRGY-J3F83-CF43C-D67TXG9N3P-GRJK6-VM63J-F9M27-KHGXKX2YWD-NWJ42-3 ...

  2. Kali-linux使用Nessus

    Nessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它.该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库.Nessus不同于传统的漏洞扫描软件,Nessus可同时在 ...

  3. [Python 多线程] 详解daemon属性值None,False,True的区别 (五)

    本文以多个例子介绍Python多线程中daemon属性值的区别. 回顾: 前面的文章简单介绍了在现代操作系统中,每一个进程都认为自己独占所有的计算机资源. 或者说线程就是独立的王国,进程间是相对独立的 ...

  4. pathinfo

    location ~ \.php { fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param PATH_INFO $fastcgi_p ...

  5. iOS 二维码生成 记录一下

    #import <CoreImage/CoreImage.h> @property (nonatomic, nonnull , strong) UIImageView *showImage ...

  6. webpack4.x最详细入门讲解

    前言 本文主要从webpack4.x入手,会对平时常用的Webpack配置一一讲解,各个功能点都有对应的详细例子,所以本文也比较长,但如果你能动手跟着本文中的例子完整写一次,相信你会觉得Webpack ...

  7. Web | JavaScript的提升机制

    作用对象: 函数和变量的声明. 作用效果: 会将其声明提升到其所在的作用域的最顶端.函数会优先于变量的声明. //函数的提升优于变量的提升 test(); var a=2; function test ...

  8. Ajax中异步与同步的区别

    同步可以解决,只有前一个请求结束后,当前请求才会发起.

  9. nginx 开启phpinfo

    在nginx配置文件中加 location / { //如果是资源文件,则不走phpinfo模式 if (!-e $request_filename){ ewrite ^/(.*)$ /index.p ...

  10. Alluxio原理和应用场景随笔

    上周末有幸参加了Alluxio(之前也叫Tachyon),七牛云和示说网举办的Alluxio上海Meetup,之前我并没有在真实应用场景中使用过Alluxio,对其适用的应用场景一直报怀疑态度.自信聆 ...