本章节简单介绍一下使用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. 创建一个工程
<!--[if !supportLists]--> (1) <!--[endif]-->启动VS2012,在已经安装的模板中选择ASP.NET MVC4 Web 应用程序,单击确定
<!--[if !supportLists]--> (2) <!--[endif]-->在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 = 1, Age = 23, Birthday = Convert.ToDateTime("1977-05-30"), Name = "情缘", Sex = "男" }); list.Add(new Contact() { ID = 2, Age = 55, Birthday = Convert.ToDateTime("1937-05-30"), Name = "令狐冲", Sex = "男" }); list.Add(new Contact() { ID = 3, Age = 12, Birthday = Convert.ToDateTime("1987-05-30"), Name = "郭靖", Sex = "男" }); list.Add(new Contact() { ID = 4, Age = 18, 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 + 1; 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
代码下载
转载于:https://www.cnblogs.com/xiaohuaidan/archive/2012/10/17/2728216.html
相关资源:JAVA上百实例源码以及开源项目