本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查。目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的。下面我们通过创建一个简单的Web API来管理联系人

说明:为了方便数据不使用真正的数据库,而是通过内存数据模拟

1.       Web API中包含的方法

Action

HTTP method

Relative URI

GetAllContact

GET

/api/contact

GetContact

GET

/api/contact /id

GetListBySex

GET

/api/contact?sex=sex

PostContact

POST

/api/contact

PutContact

PUT

/api/contact/id

DeleteContact

DELETE

/api/contact/id

http 四个主要的处理方法(get,put,post,delete)能够用来处理匹配增删改查操作:

Get 可以在服务端检索匹配URI匹配的资源,不会对服务器数据进行修改操作

Put 用户修改URI指定的特定资源,如果服务端允许,Put 也可以用户创建新的资源

Post 可以用于创建一个资源。服务端会为这个资源创建一个新的URI,并且将这个资源作为ResposeMessage 的一部分返回

Delete 用户删除URI匹配的资源

2.  创建一个工程

(1)    
启动VS2012,在已经安装的模板中选择ASP.NET MVC4 Web 应用程序,单击确定

      (2)    
在ASP.NET MVC 4 项目对话框中选择 Web API,单击确定

(3) 添加一个Model,工程选择Models文件夹右键添加一个实体类,代码如下


public class Contact
    {
        public int ID { get; set; }         public string Name { get; set; }         public string Sex { get; set; }         public DateTime Birthday { get; set; }         public int Age { get; set; }

}

(4) 添加一个数据操作接口


public interface IContactRep
    {
        /// <summary>
        /// 查询所有
        /// </summary>
        /// <returns></returns>
        IEnumerable<Contact> GetListAll();         /// <summary>
        /// 根据ID查询
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Contact GetByID(int id);         /// <summary>
        /// 添加
        /// </summary>
        /// <param name="contact"></param>
        /// <returns></returns>
        Contact Add(Contact contact);         /// <summary>
        /// 根据ID删除
        /// </summary>
        /// <param name="id"></param>
        void Remove(int id);         /// <summary>
        /// 修改
        /// </summary>
        /// <param name="contact"></param>
        /// <returns></returns>
        bool Update(Contact contact);

}

(5)  添加数据操作接口实现类


public class ContactRep : IContactRep
    {
        private Log.Log log = Log.Log.Instance(typeof(ContactRep));
        private List<Contact> list = new List<Contact>();
        public ContactRep()
        {
            log.Info("执行构造方法");
            list.Add(new Contact() { ID = , Age = , Birthday = Convert.ToDateTime("1977-05-30"), Name = "情缘", Sex = "男" });
            list.Add(new Contact() { ID = , Age = , Birthday = Convert.ToDateTime("1937-05-30"), Name = "令狐冲", Sex = "男" });
            list.Add(new Contact() { ID = , Age = , Birthday = Convert.ToDateTime("1987-05-30"), Name = "郭靖", Sex = "男" });
            list.Add(new Contact() { ID = , Age = , Birthday = Convert.ToDateTime("1997-05-30"), Name = "黄蓉", Sex = "女" });
        }         public IEnumerable<Contact> GetListAll()
        {
            return list;
        }         public Contact GetByID(int id)
        {
            return list.Find(item => item.ID == id);
        }         public Contact Add(Contact contact)
        {
            if (contact == null)
            {
                throw new NullReferenceException("空引用异常");
            }
            int maxid = list.Max(item => item.ID);
            contact.ID = maxid + ;
            list.Add(contact);
            return contact;
        }         public void Remove(int id)
        {
            list.RemoveAll(item=>item.ID==id);
        }         public bool Update(Contact contact)
        {
            if (contact == null)
            {
                throw new NullReferenceException("空引用异常");
            }
            Remove(contact.ID);
            list.Add(contact);
            return true;
        }

}

(6)在Controllers文件中添加一个APIController

3. 获得一个资源

Action

HTTP method

Relative URI

GetAllContact

GET

/api/contact

GetContact

GET

/api/contact/id

GetListBySex

GET

/api/contact?sex=sex

获得所有联系人

public IEnumerable<Contact> GetAllContact()
{
            return provider.GetListAll();

}

这个方法以Get开头,用于匹配Get方式请求,因为这个方法没有参数,所以这个方法将匹配/api/contact的请求

根据id获得联系人


public Contact GetContact(int id)
{
            Contact contact = provider.GetByID(id);
            if (contact == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return contact;

}

这个方法也是以Get方式开头,而这个方法包含一个id参数,这个方法会匹配/api/contact/id 的请求,而请求中的参数id会自动转换为int类型

如果没有找到相应id的联系人,则会抛出一个HttpResponseMessage的异常,这个异常是指向的404异常,请求资源不存在。

根据性别获得资源

public IEnumerable<Contact> GetListBySex(string sex)
{
            return provider.GetListAll().Where(item => item.Sex == sex);

}

如果一个请求中包含了一个查询的参数,web api 将尝试匹配/api/contact?sex=sex

4. 创建一个资源

客户端发送一个Post请求,会创建一个新的contact

public Contact PostContact(Contact contact)
{
            contact = provider.Add(contact);
            return contact;

}

为了处理post请求,我们需要声明一个以post开头的方法,方法中包含一个Contact类型的参数,这个参数从请求的body中序列化而来,所以客户端调用的时候传递的要是一个序列化过的Contact对象,序列化的格式可以是json,xml。

创建资源响应状态:

Response Code: 默认情况下,web api框架设置响应的状态为200(OK), 基于Http/1.1 协议,在使用post创建一个资源contact的时候,服务器响应状态为201 (Created)

Location:  当创建一个新的资源之后,我们需要 Response Headers 路径中包含一个URI。Web API框架将这个边的非常简单,看如下代码:


public HttpResponseMessage PostContact(Contact contact)
{
            contact = provider.Add(contact);
            HttpResponseMessage response = Request.CreateResponse<Contact>(HttpStatusCode.Created, contact);
            string uri = Url.Link("", new { id = contact.ID });
            response.Headers.Location = new Uri(uri);
            return response;

}

这个方法返回的是一个HttpResponseMessage 而不是一个contact对象,我们可以获得请求响应的详细信息,包括状态码以及响应头信息。

使用CreateResponse可以创建一个HttpResonseMessage,并且会自动将Contact对象序列化写入响应Body中。

5.       修改一个资源 


public void PutContact(int id, Contact contact)
{
            contact.ID = id;
            bool flag = provider.Update(contact);
            if (!flag)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

}

方式是以Put开头,当请求Mehtod 为Put,这个请求将匹配这个方法,方法中包含了两个参数,这两个参数来自URI请求参数和Request Body 中

6. 删除一个资源

public void DeleteContact(int id)
{
            provider.Remove(id);
            throw new HttpResponseException(HttpStatusCode.NoContent);

}

删除基本和上面都一样了,只是请求method 不一样而已,这里不再累述

客户端调用参考上一章说明代码

代码下载

相关参考文章链接

转自:http://www.cnblogs.com/qingyuan/archive/2012/10/16/2725378.html

【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查的更多相关文章

  1. ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...

  2. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  3. 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  4. ASP.NET MVC Web API 学习笔记---Web API概述及程序示例

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  5. ASP.NET MVC Web API 学习笔记---第一个Web API程序【转】

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html 1. Web API简单说明 近来很多大型的平台都公开了Web API. ...

  6. ASP.NET MVC Web API 学习笔记---第一个Web API程序---近来很多大型的平台都公开了Web API

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  7. ASP.NET Web API基于OData的增删改查,以及处理实体间关系

    本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先是比较典型的一对多关系,Supplier和Product. public class Product { ...

  8. [转]ASP.NET Web API基于OData的增删改查,以及处理实体间关系

    本文转自:http://www.cnblogs.com/darrenji/p/4926334.html 本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先 ...

  9. asp.net mvc 三层加EF 登录注册 增删改查

    首先打开vs软件新建项目创建web中的mvc项目再右击解决方案创建类库项目分别创建DAL层和BLL层再把DAL层和BLL层的类重命名在mvc项目中的Models文件夹创建model类在DAL创建ADO ...

随机推荐

  1. node(邮件发送特性)

    1.安装 npm install nodemailer https://github.com/andris9/Nodemailer 2.配置发邮件的账户开启SMTP功能: 3.程序样例如下: var ...

  2. Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制

    一.事件的捕获与冒泡 由W3C规定的DOM2标准中,一次事件的完整过程包括三步:捕获→执行目标元素的监听函数→冒泡,在捕获和冒泡阶段,会依次检查途径的每个节点,如果该节点注册了相应的监听函数,则执行监 ...

  3. 线程池ThreadPool知识碎片和使用经验速记

    ThreadPool(线程池)大概的工作原理是,初始时线程池中创建了一些线程,当应用程序需要使用线程池中的线程进行工作,线程池将会分配一个线程,之后到来的请求,线程池都会尽量使用池中已有的这个线程进行 ...

  4. Flash AS实现时钟效果(全脚本实现)

    最近工作中用到个Flash效果,好久没有写FlashAS脚本了,就想从以前写的代码中找一些实例.竟然看到硬盘中还留有若干年前的代码. 这个时钟效果是全部采用脚本实现,图形也是用脚本绘制的.写于2005 ...

  5. git rm–r folder fatal:pathspec "" did not match any files

    问题描述: 某年某月某日,在查看git库的时候,发现文件的分布和文件夹的名字是极其不合理的,所以移动和重命名了某些文件. 在删除(git rm –r folder)一个空文件夹的时候,出现错误:fat ...

  6. 奇怪的BUG

    熟语说“常在河边走,哪能不湿鞋”,在现实中我想说:“代码写多了,总会遇到奇怪的bug”,遇到bug不可怕,可怕的是不自己不知道这么解决,有些bug能当时解决,有些在自己知识水平提高后知道如何解决.还有 ...

  7. GUID相关知识

      全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想 ...

  8. 06- Shell脚本学习--其它

    Shell输入输出重定向 Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 输出 ...

  9. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?

    不是.可以用任意类型. 索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了 ...

  10. paip.java 架构师之路以及java高级技术

    paip.java 架构师之路以及java高级技术 1.    Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...