Web Api初试

前言

  ASP.NET Web API 与之前的内建HTTP服务解决方案的不同之处在于,它一开始就是围绕HTTP协议及其消息语义构建起来的。与WCF REST或ASP.NET AJAX加ASMX相比,它不是对现有框架的增强,而是一个全新的平台。新的ASP.NET Web API的优势在于它汇集了之前各平台的各种最佳特性,结合为一个全面而不臃肿的HTTP平台。这套Web API基于ASP.NET,又借用了很多ASP.NET MVC的概念,应该很容易被ASP.NET的开发者适应和熟悉。ASP.NET Web API有一些核心功能,能让它成为ASP.NET MVC框架现用户的自然选择,同时也切合HTTP端点开发者的需要。

  • 完善支持URL路由,透过用户熟悉的MVC风格路由语义,生成干净的URL
  • 根据Accept标头对请求和响应的序列化形式进行内容协商(Content Negotiation)
  • 支持大量输出格式,包括JSON、XML、ATOM等
  • 默认对REST语义有完善支持,同时又不强制限定必须使用REST语义
  • 易于扩展的Formatter机制,支持添加新的输入/输出类型
  • 可通过HttpResponseMessage类、HttpRequestMessage类和强类型枚举来描述大量的HTTP操作,提供对更高级的HTTP特性的深度支持
  • 基于惯例的设计引导用户按HTTP Services的正确方式行事
  • Formatters和Filters延续了MVC的扩展模型,具备出色的扩展能力
  • 用于非Web程序时,可以脱离IIS运行(Self-hostable)
  • 具备可测试性,测试机制的设计类似于MVC

以上文字出自 Richard Seroter 的《微软随.NET 4.5发布新REST API框架》一文,本人初次接触WEB API,所以此次试着写了一个简单的例子。

1、创建Asp.net web api解决方案,添加mvc4项目中的web api模板

2、创建Model

  创建一个应用程序需要的model类,在http响应过程中web api可以自动将其序列化为xml,json或者其他数据类型,同时也可以在客户端接收响应的时候指定http头来实现我们想要接收的数据类型。

在models文件夹下添加Customer实体:

public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public string Designation { get; set; }
public decimal Salary { get; set; }
}

3、添加ApiController

在控制器文件夹下有2个默认的controller,一个是普通的,一个是apicontroller,添加一个CustomersController来继承ApiController,然后添加如下方法:

//
// 数据源
Customer[] customers = new Customer[]
{
new Customer { Id = 1, Name = "张三", Designation = "程序员", Salary = 50000 },
new Customer { Id = 2, Name = "李四", Designation = "人事", Salary = 40000 },
new Customer { Id = 3, Name = "田鸡", Designation = "后勤", Salary = 15000 } ,
new Customer { Id = 4, Name = "刘风", Designation = "副总", Salary = 55000 } ,
new Customer { Id = 5, Name = "程侯", Designation = "项目经理", Salary = 60000 }
};
//返回所有的人员
public IEnumerable<Customer> GetCustomers()
{
return customers;
}
//根据id查询
public Customer GetCustomerById(int id)
{
var customer = customers.FirstOrDefault((p) => p.Id == id);
if (customer == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return customer;
}
//根据职位查询
public IEnumerable<Customer> GetCustomersByDesignation(string designation)
{
if (!string.IsNullOrEmpty(designation))
{
return customers.Where(
p => p.Designation.Contains(designation));
}
return customers;
}

根据默认的api路由规则可以得出action和uri如下对应规则:

路由:

    public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
action uri
GetCustomers /api/customers
GetCustomerById /api/customers/id
GetCustomersByDesignation /api/customers/?designation=des

下面在浏览器中分别请求以上三个方法查看返回值:

http://localhost:xxxx/api/customers:

http://localhost:60764/api/customers/1:

http://localhost:60764/api/customers/?designation=%E5%90%8E%E5%8B%A4:

下面通过jquery实现下面效果:

在index页面中添加如下代码:

<div id="body">
<div class="main-content">
<div>
<h1>所有成员</h1>
<ul id="customers">
</ul>
</div>
<div>
<label for="custId">ID:</label>
<input type="text" id="custId" size="5" />
<input type="button" value="Search" onclick="findById();" />
<br />
<label for="designationValue">Designation:</label>
<input type="text" id="designationValue" size="5" />
<input type="button" value="Search" onclick="findByDesignation();" /> <div id="customer" />
<ul id="customersByDesignation">
</ul>
</div>
</div>
</div>

通过jquery.ajax请求填充数据:

    <script type="text/javascript">
$(function () {
//获取所有人员
$.getJSON("/api/customers", function (data) {
$.each(data, function (i,val) {
$("#customers").append("<li>" + val.Name + "</li>");
})
})
})
//根据id搜索
function findById() {
var id = $('#custId').val();
$.getJSON("/api/customers/" + id,function (data) {
var str = data.Name + ': $' + data.Salary;
$('#customer').text(str);
})
.fail(
function (jqXHR, textStatus, err) {
$('#customer').text('Error: ' + err);
});
}
//根据职位描述搜索
function findByDesignation() {
var strDv = $('#designationValue').val();
var table = '<table><tr style=font-weight:bold><th>Name</td><td>Salary</th></tr>'
$.getJSON("api/customers?designation=" + strDv, function (data) {
$.each(data, function (key, val) {
var str = val.Name + ': $' + val.Salary;
table = table + '<tr><td>' + val.Name + '</td><td>' + val.Salary + '</td></tr>'
});
table = table + '</table>';
$('#customer').html(table); })
.fail(
function (jqXHR, textStatus, err) {
$('#customer').text('Error: ' + err);
});
}
</script>

很简单代码不做过多的说明了。

第一次使用mvc4中的新东西,没有深入使用,以此做个记号标记入门。

Web Api初试的更多相关文章

  1. 初试ASP.NET Web API/MVC API(附Demo)

    写在前面 HTTP RESTful 创建Web API 调用Web API 运行截图及Demo下载 ASP.NET Web API是​​一个框架,可以很容易构建达成了广泛的HTTP服务客户端,包括浏览 ...

  2. [ASP.NET]初试Web API

    Web API 1: 需要环境(VS2010/.Net4.0/MVC4 ) http://www.asp.net/web-api/overview/creating-web-apis/creating ...

  3. ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)

    问题场景: ASP.NET MVC Web API 定义 Post 方法,HttpClient 使用 JsonConvert.SerializeObject 传参进行调用,比如 Web Api 中定义 ...

  4. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  5. bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序

    也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...

  6. Hello Web API系列教程——Web API与国际化

    软件国际化是在软件设计和文档开发过程中,使得功能和代码设计能处理多种语言和文化习俗,在创建不同语言版本时,不需要重新设计源程序代码的软件工程方法.这在很多成熟的软件开发平台中非常常见.对于.net开发 ...

  7. ASP.NET Web API 跨域访问(CORS)

    一.客户端用JSONP请求数据 如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的: {"YourSignatu ...

  8. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  9. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

随机推荐

  1. $.each()方法详解

    $.each()方法详解 each()函数具有十分强大的遍历功能,可以遍历一维数组.多维数组.Dom.Json等. 在JavaScript中使用$.each可以大大减轻我们的工作量. 1.处理一维数组 ...

  2. MVC模型部分验证

    ASP.NET MVC模型部分验证 在很多情况下,我们为了代码的复用可能会存在ViewModel共用的情形.比方说,web应用中常常会遇到的一个需求就是用户找回密码的功能.用户首先要验证通过验证邮箱( ...

  3. Linq to Sql : 动态构造Expression进行动态查询

    原文:Linq to Sql : 动态构造Expression进行动态查询 前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?Expression<Fu ...

  4. yii中登录后跳转回登录前请求的页面

    当我们请求一个经过权限控制的请求不通过时,会跳转到一个地方请求权限,请求结束后需要跳转回之前的页面.比如我们请求一个需要登录的action,会被跳转到login页面,我们希望登录成功后跳转到我们之前希 ...

  5. Apache启动失败,请检查相关配置。MySQL5.1已启动成功

    解决办法 一: 把左下角的SSL钩上了,如果你没有用证书,就把那个去掉,有的朋友去掉就可以了.也可能再装了证书钩上SSL也可以用了. 二: 看了说的把SSL勾掉的办法,也解决不了.后来就去查卡巴,也没 ...

  6. JS自动化测试 单元测试之Qunit

    前言 因为公司开发了一套javascript SDK需要测试,在网上找了很久,找到了JQuery团队开发的QUnit,和基于JUnit的JsUnit,还有一些还没有看,先讲讲QUnit吧 下载 登录J ...

  7. Math.Round函数四舍五入

    Math.Round函数四舍五入的问题   今天客户跑过来跟我说,我们程序里面计算的价格不对,我检查了一下,发现价格是经过折算后的价格,结果是可能小数位较多,而单据上只能打印两位价格,所以就对价格调用 ...

  8. DDD分层架构之领域实体(基础篇)

    DDD分层架构之领域实体(基础篇) 上一篇,我介绍了自己在DDD分层架构方面的一些感想,本文开始介绍领域层的实体,代码主要参考自<领域驱动设计C#2008实现>,另外参考了网上找到的一些示 ...

  9. 强大的jquery-制作选项卡

    最近在学习jquery,特地把今天写的一个选项卡源码贴出来.只是做只是梳理,大神们请不要吐槽,如果有更好的方法,欢迎指点.谢谢. css <style> #tab div{ width:2 ...

  10. CruiseControl.Net全面实现持续集成

    使用CruiseControl.Net全面实现持续集成   持续集成想必大家很多人都听说过,甚至都实践过,最近我又一次亲历了一次持续集成,现将我的经验分享给大家.关于持续集成的理论在本文概不涉及,本文 ...