联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址http://code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d . 下面的文章以这个示例讲解ASP.NET Web API的各方面知识:

1、CRUD操作: CURD 是 "Create, Read, Update, Delete" (新增、读取、更新、删除) 的简写,这四个动作是数据库基本操作。

Web API CRUD 方法说明

Action说明

HTTP方法

URI关连

取得所有联系人清单

GET

/api/contacts

透过 id 取得联系人数据

GET

/api/contacts/id

新增一位联系人

POST

/api/contacts

更新联系人数据

PUT

/api/contacts/id

删除联系人数据

DELETE

/api/contacts/id

由上表中,我们可以很清楚看到,有两种资源类型( resource types):

URI 资源类型

URI

说明

/api/contacts

列出所有联系人

/api/contacts/id

一位联系人

HTTP 方法

HTTP 主要方法 (GET, PUT, POST, DELETE) 能对应到 CURD 操作:

· GET 接收及显示。GET 在服务器应该没有副作用。

· PUT 更新。PUT 也能拿来"新增"使用,如果服务器允许 Client 去指定新的 URI。那范例的联系人管理将不允许使用 PUT 来新增。

· POST 新增。服务器会给 URI 分配新对象,然后返回此 URI 作为响应消息的一部分。

· DELETE 删除

新增资源

在 ASP.NET Web API,你能在 Model 使用强型别 CLR 对象,他们将会自动序列化为 XML 或 JSON 给 Client。在Model 目录Contact

public class Contact
    {
        public int ContactId { get; set; }

public string Name { get; set; }

public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Zip { get; set; }
        public string Email { get; set; }
        public string Twitter { get; set; }

public string Self
        {
            get { return string.Format(CultureInfo.CurrentCulture, "contact/{0}", this.ContactId); }
            set { }
        }
    }

使用仓储模式( Repository Pattern)

我们的 HTTP Service 需要储存联系人列表,此范例,联系人列表会储存在内存( List(Of T ) )。使用 Repository Pattern 会让此对象从我们的 Service 实作中切割出来。在 Model 目录,新增一个 Interface 接口,名称 IContactRepository.cs

public interface IContactRepository
   {
       void Update(Contact updatedContact);

Contact Get(int id);

List<Contact> GetAll();

void Post(Contact contact);

void Delete(int id);
   }

以上定义出我们需要的 CRUD 相关功能接口,然后一样在 Model 目录下新增一个新的类文件,类文件 "ContactRepository.cs",此类将实作 IContactRepository 接口。以下为相关实现:

public class ContactRepository : IContactRepository
    {
        private int nextContactID;

private IList<Contact> contacts;

public ContactRepository()
        {
            contacts = new List<Contact>();
            contacts.Add(new Contact { ContactId = 1, Name = "Glenn Block", Address = "1 Microsoft Way", City = "Redmond", State = "Washington", Zip = "98112", Email = "gblock@microsoft.com", Twitter = "gblock" });
            contacts.Add(new Contact { ContactId = 2, Name = "Howard Dierking", Address = "1 Microsoft Way", City = "Redmond", State = "Washington", Zip = "98112", Email = "howard@microsoft.com", Twitter = "howard_dierking" });
            contacts.Add(new Contact { ContactId = 3, Name = "Yavor Georgiev", Address = "1 Microsoft Way", City = "Redmond", State = "Washington", Zip = "98112", Email = "yavorg@microsoft.com", Twitter = "digthepony" });
            contacts.Add(new Contact { ContactId = 4, Name = "Jeff Handley", Address = "1 Microsoft Way", City = "Redmond", State = "Washington", Zip = "98112", Email = "jeff.handley@microsoft.com", Twitter = "jeffhandley" });
            contacts.Add(new Contact { ContactId = 5, Name = "Deepesh Mohnani", Address = "1 Microsoft Way", City = "Redmond", State = "Washington", Zip = "98112", Email = "deepm@microsoft.com", Twitter = "deepeshm" });
            contacts.Add(new Contact { ContactId = 6, Name = "Brad Olenick", Address = "1 Microsoft Way", City = "Redmond", State = "Washington", Zip = "98112", Email = "brado@microsoft.com", Twitter="brado_23" });
            contacts.Add(new Contact { ContactId = 7, Name = "Ron Jacobs", Address = "1 Microsoft Way", City = "Redmond", State = "Washington", Zip = "98112", Email = "rojacobs@microsoft.com", Twitter = "ronljacobs" });
            nextContactID = contacts.Count + 1;
        }

public void Update(Contact updatedContact)
        {
            var contact = this.Get(updatedContact.ContactId);
            contact.Name = updatedContact.Name;
            contact.Address = updatedContact.Address;
            contact.City = updatedContact.City;
            contact.State = updatedContact.State;
            contact.Zip = updatedContact.Zip;
            contact.Email = updatedContact.Email;
            contact.Twitter = updatedContact.Twitter;
        }

public Contact Get(int id)
        {
            return contacts.SingleOrDefault(c => c.ContactId == id);
        }

public List<Contact> GetAll()
        {
            return contacts.ToList();
        }

public void Post(Contact contact)
        {
            contact.ContactId = nextContactID++;
            contacts.Add(contact);
        }

public void Delete(int id)
        {
            var contact = this.Get(id);
            contacts.Remove(contact);
        }
    }

实现没有什么难处,要处理都是 List(Of Contact) 所提供的 .Add(), .Remove(), .Find() 以进行相关新增、删除、查询动作。另外,还利用 LINQ 的 .AsQueryable() 来将 List 型别转换,才有办法以 IQueryable() 来回传。以上利用 List 来仿真数据库,或者说,把 List 想象成内存里的数据库。

Web API Controller(ContactsController)

ContactsController是 HTTP Service 的程序代码,注意命名开始要对应到 HTTP Method,主要就是约定胜于配置理念。“约定”即规则。规则是预先定义的,工程师只需要按着规则来做事,就不需要额外的“配置”。当然也可以不对应,通过HttpMothod打标签也可以的。

取得资源

取得资源是 Read 与 GET 的对应关系。在联系人管理中提供了二个 Action,一个是读取所有联系人,一个是通过 id 来取得联系人。这两个 Action 都定义在 HTTP GET 方法,记得方法必须以 "Get..." 开头。

· GET /api/contacts

· GET /api/contacts/id

新增资源

新增资源是 Create 与 POST 的对应关系。要新增一位联系人,Client 送出一个 HTTP POST 请求,请求信息包含新联系人的相关内容。记得方法必须以 "Post..." 开头。

public HttpResponseMessage<Contact> Post(Contact contact)
        {
            this.repository.Post(contact);
            var response = new HttpResponseMessage<Contact>(contact) { StatusCode = HttpStatusCode.Created };

string uri = Url.Route("default", new { id = contact.ContactId });

response.Headers.Location = new Uri(Request.RequestUri, uri);

return response;
        }

默认从请求主体(request body)来而的参数解序列化后是复合(complex)类型。因此,我们预期 Client 传送给我们的是一个经序列化表现的联系人对象,使用 XML 或 JSON 来序列化。以上的实现考虑到两件事:

· Response code
默认,Web API Framework 设定回传状态代码(status code)为 200 (OK)。但按照 HTTP/1.1 协议,当一个 POST 请求会导致资源的建立,服务器应该响应的状态代码为 201 (Created)。

· Location当服务器新增一个资源,它应该在响应的 Location header 中包含新资源的 URI。

注意返回类型是 HttpResponseMessage(Of Contact)HttpResponseMessage(Of T) 型别是一个用强类型表示的 HTTP 响应消息。泛型参数 T 会取得 CLR 型别然后序列化到信息主体。

更新资源

更新资源是 Update 与 PUT 的对应关系。更新联系人作法相当直觉,记得方法必须以 "Put..." 开头。

public Contact Put(int id, Contact contact)
{
           contact.ContactId = id;
           this.repository.Update(contact);
           return contact;
}

方法中有二个参教,联系人 id 与 更新的联系人数据。id 参数会从 URI 路径取得,联系人参数是从请求主体解串行化而来。默认,ASP.NET Web API Framework 会从请求主体 (request body)里的 route 与 复合(complex) 型别来取得简易的参数类型。

删除资源

删除资源是 Delete 与 DELETE 的对应关系。

public HttpResponseMessage Delete(int id)
{
            var deleted = this.repository.Get(id);
            this.repository.Delete(id);
            return new HttpResponseMessage(HttpStatusCode.NoContent);

}

依据 HTTP 规范,DELETE 方法必须是 idmpotent(幂等),意味着几个相同 URI 的删除请求必须和一个删除请求有相同效果。因此,如果联系人已经被删除,方法应该不能回传错误码。
如果 DELETE 请求成功,你能回传状态 200 (OK) 描述该实体主体(即要删除的主体)的状态,或如果删除持续未处理回传状态 202 (Accepted) ,或没有实体主体回传状态 204 (No Content)。我们范例会返回状态 204 (No Content)。

CRUD 操作总结

在使用 ASP.NET Web API Framework 时,你能发现与 HTTP/1.1 规范有很大关连性,以前较很少关心与了解的内容,例如,PUT、DELETE、POST的处理,以及状态代码的处理等,现在变成要开注意的几个点。

Contact Manager Web API 示例[1]CRUD 操作相关推荐

  1. Contact Manager Web API 示例[4] 异常处理(Exception Handling)

    联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址http://code.msdn.mi ...

  2. java调用asp.net webapi_通过HttpClient 调用ASP.NET Web API示例

    在前面两篇文章中我们介绍了ASP.NET Web API的基本知识和原理,并且通过简单的实例了解了它的基本(CRUD)操作.我们是通过JQuery和Ajax对Web API进行数据操作.这一篇我们来介 ...

  3. Dynamics CRM2016 Update or Create parentcustomerid in Contact using web api

    联系人实体中有个特殊的字段parentcustomerid 在通过web api创建或更新记录时,如果在给这个字段赋值时当做查找字段对待的话,那你就会遇到问题了,报错信息如下 正确的赋值方式如下 转载 ...

  4. 使用Entity Framework和Web API的ASP.NET Core Blazor CRUD

    目录 介绍 背景 先决条件 使用代码 第1步--创建数据库和表 第2步--创建ASP.NET Core Blazor应用程序 ASP.NET Core Blazor解决方案的新增功能是什么? 客户端项 ...

  5. 使用VS 2019,.NET Core 3和Web API创建ASP.NET Core Blazor CRUD应用程序

    目录 介绍 Blazor Blazor客户端应用程序 Blazor服务器应用程序 背景 先决条件 使用代码 第1步-创建数据库和表 第2步-创建ASP.NET Core Blazor服务器应用程序 运 ...

  6. 【ASP.NET Web API教程】2 创建各种Web API

    原文 [ASP.NET Web API教程]2 创建各种Web API Chapter 2: Creating Web APIs 第2章 创建各种Web API 本文引自:http://www.asp ...

  7. 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API

    返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API 原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 ...

  8. 【ASP.NET Web API教程】3.3 通过WPF应用程序调用Web API(C#)

    注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 3.3 Calling a Web API From a WPF Application ...

  9. ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序

    目录 介绍 设置和运行示例应用程序 类库项目 依赖注入 访问应用程序设置 实体框架核心相关更改 主键标识插入问题 数据上下文和连接字符串 自定义存储库(Repositories) LINQ表达式翻新( ...

最新文章

  1. GO是更好的编程语言吗?
  2. 415 (Unsupported Media Type)
  3. C/C++反序输出字符串总结
  4. java jar 版本号_java – 获取JAR文件版本号
  5. NYOJ 201 作业题 动态规划
  6. 从javaagent迁移到JVMTI:我们的经验
  7. JS_17 ES5,ES6
  8. linux的基础知识——捕捉SIGCHLD、信号传参,中断系统调用
  9. windows update 无法启动 报错87:参数错误的解决方法
  10. 亚马逊Alexa即将推出基于AI的耳语模式
  11. 微信第三方网页关闭当前页面回到微信对话窗口
  12. 2022Java后端学习主流知识学习系列(建议先收藏)
  13. 好消息,个税起征点要提至每月5000了!
  14. C3D:视频动作分类demo实现
  15. 3.千万日活的签到系统如何设计?
  16. 首席新媒体运营黎想教程:最全电商运营方案,50个技巧详解
  17. 智慧数字经营小程序存在的意义和价值分析
  18. AB报,开创网上免费看原版报纸的新模式!
  19. CVPR2022自适应/语义分割:Class-Balanced Pixel-Level Self-Labeling for Domain Adaptive Semantic Segmentation
  20. android电视!Android多进程从头讲到尾,再不刷题就晚了!

热门文章

  1. ES6新特性_let使用案例---JavaScript_ECMAScript_ES6-ES11新特性工作笔记004
  2. SpringCloud学习笔记025---SpringBoot_注释理解_@Qualifier 注释
  3. ubuntu上装texlive
  4. anaconda windows theano keras 完全安装教程,没有gpu忽略那段话也成功了
  5. bzoj 1041: [HAOI2008]圆上的整点
  6. Vc6.0 调试指南 --Happy Debugging
  7. mysql跨库分页查询,“跨库分页”的四种方案
  8. 前端输入框错误提示_WEB/APP开发基础之旅--前端、服务器端、数据库综合开发案例...
  9. linux下tomcat发布网站验证码获取不到
  10. 随想录(动态库的特点)