本章節簡單介紹一下使用ASP.NET MVC Web API 做增删改查。目前很多Http服務還是通過REST或者類似RESP的模型來進行資料操作的。下面我們通過建立一個簡單的Web API來管理聯系人
說明:為了友善資料不使用真正的資料庫,而是通過記憶體資料模拟
1. Web API中包含的方法
Action
HTTP method
Relative URI
GetAllContact
GET
/api/contact
GetContact
/api/contact /id
GetListBySex
/api/contact?sex=sex
PostContact
POST
PutContact
PUT
/api/contact/id
DeleteContact
DELETE
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();
/// 根據ID查詢
/// <param name="id"></param>
Contact GetByID(int id);
/// 添加
/// <param name="contact"></param>
Contact Add(Contact contact);
/// 根據ID删除
void Remove(int id);
/// 修改
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)
Remove(contact.ID);
return true;
}
(6)在Controllers檔案中添加一個APIController
3. 獲得一個資源
獲得所有聯系人
public IEnumerable<Contact> GetAllContact()
{
return provider.GetListAll();
}
這個方法以Get開頭,用于比對Get方式請求,因為這個方法沒有參數,是以這個方法将比對/api/contact的請求
根據id獲得聯系人
public Contact GetContact(int id)
Contact contact = provider.GetByID(id);
throw new HttpResponseException(HttpStatusCode.NotFound);
這個方法也是以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);
為了處理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)
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)
方式是以Put開頭,當請求Mehtod 為Put,這個請求将比對這個方法,方法中包含了兩個參數,這兩個參數來自URI請求參數和Request Body 中
6. 删除一個資源
public void DeleteContact(int id)
provider.Remove(id);
throw new HttpResponseException(HttpStatusCode.NoContent);
删除基本和上面都一樣了,隻是請求method 不一樣而已,這裡不再累述
用戶端調用參考上一章說明代碼
相關參考文章連結
<a href="http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html">ASP.NET MVC Web API 學習筆記---第一個Web API程式</a>