ASP.NET Web API 入门大杂烩
【前言】
本文是大杂烩,意思即是:到处Copy再加一点点思考而混在一起的文章,引用来源因为太多太杂故而省略,望原作者原谅。
【概述】
ASP.NET Web API随ASP.NET MVC 4一起发行。它遵循REST架构风格,取WCF Web API与ASP.NET MVC精华,又去除WCF本身较为繁琐的配置问题,专注于提供HTTP Service,只面向Http通信协议,使得可快速开发出自身使用或对外公开的Web API。前端应用只要能发出HTTP的URI请求(例如:http://domain/api/products)向Web API请求服务即可取得如JSON或XML或自定义数据源。
ASP.NET Web APIWeb API 的开发类似于 ASP.NET MVC 中控制器的开发,但是Web API 封装了数据的序列化、反序列化,接口、实现都更加简单。 简单地说,如果要向浏览器、移动端等广泛的客户端提供 Json/xml 数据格式,则应首选 ASP.NET Web API。
从 .NET 3.5 开始 WCF 框架已经支持用 WebHttpBinding 构建建立在 WCF Message 栈上的 RESTful Web服务。因为 REST 的工作原理不同,不需要依赖 SOAP 协议,因此 WCF 消息管道对它做了特殊的优化。但 REST 集成在 WCF 消息管道上还是不理想,所以微软提出在 ASP.NET 平台上构建REST,也就有了现在中的 Web Api。
【入门】
1、首先确保开发环境符合微软的要求:
- Visual Studio 2012
- Visual Studio Express 2012 for Web
- Visual Studio 2010 with ASP.NET MVC 4 installed.(安装了ASP.NET MVC 4的VS 2010)
- Visual Web Developer 2010 Express with ASP.NET MVC 4 installed.(安装了ASP.NET MVC 4的VS 2010 Web开发者简装版)
2、新建Web API项目
图1、创建项目
图2.选择Web API项目模板
3、添加一个模型
模型是表示应用程序数据的一种对象。ASP.NET Web API可以自动把模型序列化成JSON、XML、或某些其它格式然后写到HTTP响应的消息体中。只要客户端能够读取这种序列化格式,它就可以进行反序列化获取对象信息。另一方面,设置HTTP请求消息中的Accept报头,客户端能够指示它所希望的是哪一种格式。
图3.添加模型
将这个类命名为“Product”,并添加如下属性:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace HelloWebAPI.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
}
4、添加控制器
控制器是一种处理HTTP请求的对象。“新项目”向导在创建该项目时为你创建了两个控制器。要看到它们,在“解决方案资源管理器”中展开Controllers文件夹。
HomeController 是传统的ASP.NET MVC控制器。它负责对网站的HTML页面进行服务,且与Web API无直接关系。
ValuesController 是一个例子型的WebAPI控制器。在下一步之前,将此控制器完全删除。
图4.添加一个控制器
图5.创建一个API控制器
修改此控制器的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http; using HelloWebAPI.Models; namespace HelloWebAPI.Controllers
{
public class ProductsController : ApiController
{
Product[] products = new Product[]
{
new Product { Id = , Name = "Tomato Soup", Category = "Groceries", Price = },
new Product { Id = , Name = "Yo-yo", Category = "Toys", Price = 3.75M },
new Product { Id = , Name = "Hammer", Category = "Hardware", Price = 16.99M }
};
public IEnumerable<Product> GetAllProducts()
{
return products;
}
public Product GetProductById(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return product;
}
public IEnumerable<Product> GetProductsByCategory(string category)
{
return products.Where(
(p) => string.Equals(p.Category, category,
StringComparison.OrdinalIgnoreCase));
}
}
}
为了保持示例简单,产品被存储在该控制器类的一个固定数组中。当然,在一个实际应用程序中,你会查询一个数据库,或使用某些其它外部数据源。
该控制器定义了三个方法,它们或者返回一个单一产品,或一个产品列表:
GetAllProducts方法以IEnumerable<Product>类型返回产品的完整列表。
GetProductById方法通过ID查询一个单一产品
GetProductsByCategory方法返回指定类别的全部产品。
好了,你有了一个能工作的Web API了。该控制器上的每个方法都映射到一个URI(如表1所示):
Controller Method 控制器方法 |
URI |
---|---|
GetAllProducts | /api/products |
GetProductById | /api/products/id |
GetProductsByCategory | /api/products/?category=category |
【调试】
在VS中启动调试。ASP.NET开发服务器(ASP.NET Development Server)将启动,屏幕的右下角部将出现一个通知,显示它运行的端口号。默认地,开发服务器选择随机端口号。
Visual Studio然后将自动打开浏览器窗口,其URL指向http//www.localhost:xxxx/,这里,xxxx是端口号。首页看上去应当像这样(如图6所示):
图6.应用程序首页
该首页是一个ASP.NET MVC视图,它是由HomeControllers类返回的。为了调用Web API,我们必须使用前面列出的URI之一。例如,要得到全部产品列表,浏览http://localhost:xxxx/api/products/。
结果取决于你所使用的浏览器。Internet Explorer(IE浏览器)将提示你是否打开或保存一个名称为products的“文件”(如图7所示)。
图7.IE的提示
用记事本打开:
如果用Firefox或者Chrome访问,则会在浏览器中用xml形式显示:
出现这种差别的原因是IE和Firefox发送了不同的Accept报头,因此,Web API在响应中发送了不同的内容类型。
现在,试着浏览这些URI:
- http://localhost:xxxx/api/products/1
- http://localhost:xxxx/api/products?category=hardware
第一个应当返回ID等于1的词条。第二个应当返回Category等于“hardware”的所有产品的列表(这里,只有一个词条)。
目前为止就实现了一个最简单的Web API应用。
有两个改进的方向:
在IE上按“F12”启动开发人员工具,可以看见详细的请求以及响应信息;
在页面增加按钮、输入框等实现查询等功能;
以上两步详见:调用与 Javascript 和 jQuery 的 Web API的最后部分;
【进阶】
1、实现CURD
CURD 是指对资源的增删查改,对应了Create 、 Update 、 Read 、 Delete 四个简单的数据库操作。
在Web API中,Create 、 Update 、 Read 、 Delete 分别可以通过Post,Put,Delete,Get四种HTTP方法来实现。当然,在实际应用中,更多的是使用了Get/Post方法。
在Web API中,默认在每个方法名字之前加上Create 、 Update 、 Read 、 Delete字眼就可以识别方法对应的HTTP方法,当让,也可以手动在每个方法之前增加属性标注,强制指明所使用的HTTP方法。如下所示:
[HttpGet]
[ActionName("GetUser")]
public IEnumerable<User> GetUsersByName(string userName)
{
return users.Where(
(p) => string.Equals(p.UserName, userName,
StringComparison.OrdinalIgnoreCase));
} [HttpPost]
[ActionName("AddUser")]
public User AddUser([FromBody]User user)
{
if (user == null)
{
throw new HttpRequestException();
}
users.Add(user);
return user;
}
至于ActionName标注,是方便在更改路由规则之后,可以指定一个URL访问的动作名字。
2、API路由规则
Web API会App_Start目录的WebApiConfig.cs文件创建一个默认的路由模板是“api/{controller}/{id}”:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
在这个模板中,“api”是一个标记式的文字路径,而{controller}和{id}是占位符变量。
当Web API接收到一个HTTP请求,它会试图根据路由表中的一个路由模板来匹配其URI。如果无路由匹配,客户端会接收到404(NotFound)错误。例如,以下URI与默认路由匹配:
- /api/contacts
- /api/contacts/1
- /api/products/gizmo1
然而,以下URI不匹配,因为它缺少“api”片段:
- /contacts/1
注:使用“api”的原因是为了避免与ASP.NET MVC的路由冲突。通过这种方式,可以用“/contacts”进入一个MVC控制器,而“/api/contacts”进入一个Web API控制器。
一旦匹配路由,Web API便会选择相应的控制和动作:
1,根据URI中的“控制器”作为{controller}变量的值找到Web API中的Controller。
2,为了找到动作,Web API寻找一个名称以HTTP方法名开头的动作。例如,对于一个GET请求,Web API会查找一个以“Get…”开头的动作,如“GetContact”或“GetAllContacts”等。这种约定仅运用于GET、POST、PUT和DELETE方法。通过把注解属性运用于控制器,你可以启用其它HTTP方法。也可以使用上述所说在每个方法前增加属性标注强制指明HTTP方法类型。
3,路由模板中的其它占位变量,如{id},被映射成动作参数。
正如前文说,较多的HTTP请求使用Get/POST方法,这样的话,就不排除在一个Controller里面有好几个POST方法并且参数格式也差不多的。由于默认路由只会匹配第一个匹配的方法,所以仅仅是使用默认路由是满足不了要求的。
这种情况下我们可以改变路由规则:
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
配合ActionName,NonAction标注,可以更改更精准地匹配到方法。
public class ProductsController : ApiController
{
[HttpGet]
[ActionName("Thumbnail")]
public HttpResponseMessage GetThumbnailImage(int id); [HttpPost]
[ActionName("Thumbnail")]
public void AddThumbnailImage(int id); // Not an action method.
// 不是一个动作方法
[NonAction]
public string GetPrivateData() { ... }
}
【发布】
【推荐网站】
ASP.NET Web API系列教程目录【对微软官方主页教程的良心翻译】
我最喜爱的功能:Entity Framework Code First和 ASP.NET Web API
ASP.NET Web API 入门大杂烩的更多相关文章
- 【ASP.NET Web API教程】1 ASP.NET Web API入门
原文 [ASP.NET Web API教程]1 ASP.NET Web API入门 Getting Started with ASP.NET Web API第1章 ASP.NET Web API入门 ...
- ASP.NET Web API 入门示例详解
REST服务已经成为最新的服务端开发趋势,ASP.NET Web API即为.NET平台的一种轻量级REST架构. ASP.NET Web API直接借鉴了ASP.NET MVC的设计,两者具有非常类 ...
- ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)
一.ASP.NET Web API接口定义 ASP.NET Web API默认实现了Action方法和HTTP方法的映射,Action方法方法名体现了其能处理的请求必须采用的HTTP方法 二.寄宿方式 ...
- 【Web API系列教程】1.1 — ASP.NET Web API入门
前言 HTTP不仅仅服务于web页面.同一时候也是构建暴露服务和数据的API的强大平台.HTTP有着简单.灵活和无处不在的特点.你能想到的差点儿全部平台都包括有一个HTTP库.所以HTTP服务能够遍及 ...
- ASP.NET Web API 实例
ASP.NET Web API 入门大杂烩 创建Web API解决方案,命名为VCoinWebApi,并且创建了同名的Project,然后,创建一个Empty Project:Models,创建一个W ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】
最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...
- ASP.NET Web API系列教程目录
ASP.NET Web API系列教程目录 Introduction:What's This New Web API?引子:新的Web API是什么? Chapter 1: Getting Start ...
- ASP.NET WEB API构建基于REST风格
使用ASP.NET WEB API构建基于REST风格的服务实战系列教程[开篇] 最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http ...
- ASP.NET Web API系列教程(目录)(转)
注:微软随ASP.NET MVC 4一起还发布了一个框架,叫做ASP.NET Web API.这是一个用来在.NET平台上建立HTTP服务的Web API框架,是微软的又一项令人振奋的技术.目前,国内 ...
随机推荐
- js的二元三元操作符
二元 if ( a == b) { alert(a) } // (a == b) && alert(a) if ( a != b) { alert(a) } // (a == b) | ...
- SVN 记录冲突、忽略
之前对SVN不熟悉,一碰到冲突就怕得要死,不知道应该怎么处理.今天必须要正视这个问题,研究一下. 一.冲突 SVN非常智能,它不像VSS那样,一个人在改的时候必须以独占的方式签出文件,导致其他人不能够 ...
- c++ string 转GUID及反转
#include "stdafx.h" #include <string> #include <windows.h> using namespace std ...
- 手机连接wifi自动弹窗的原理及其实现方案
一.手机连上wifi后会自动弹窗的原理 生活中,有很多需要认证的路由器,手机连接wifi热点后会自动弹出一个网页,让用户输入账号和密码,比如星巴克,肯地基,麦当劳,甚至是火车站和机场的候车室.其实这是 ...
- SpringMVC与HTML页面
springMVC返回html页面 spring-mvc.xml配置: <bean id="viewResolver" class="org.springfram ...
- 软件工程 speedsnail 冲刺7
2015-5-11 完成任务:蜗牛移动的一部分: 遇到问题: 问题1 速度,坐标,角度: 速度分级别设置: 坐标记录功能,方便障碍物检测: 暂定初始45度角: 解决1 未解决上述问题 明日任务: 蜗牛 ...
- spark性能调优:资源优化
在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...
- 获取php的配置
ini_get — 获取一个配置选项的值 返回值 成功是返回配置选项值的字符串,null 的值则返回空字符串.如果配置选项不存在,将会返回 FALSE. <?php /* 我们的 php.ini ...
- C++求斐波那契数
题目内容:斐波那契数定义为:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)(n>1且n为整数) 如果写出菲氏数列,则应该是: 0 1 1 2 3 5 8 13 21 34 …… ...
- JAVA中ArrayList用法
JAVA中ArrayList用法 2011-07-20 15:02:03| 分类: 计算机专业 | 标签:java arraylist用法 |举报|字号 订阅 Java学习过程中做题时 ...