入門:添加一個支持獲取單一資源以及支持POST,PUT和DELETE方法
WCF Web API支持多個宿主環境:自宿主(windows服務或者控制臺)和IIS宿主(asp.net webform/mvc)。這個入門文章主要演示在ASP.NET MVC3網站宿主,主要演示如何在一個Web API上允許更新:
- 如何檢索一個特定項的資源
- 如何在API上啟用HTTP POST, PUT和DELETE方法
- 如何通過HTML表單發送一個POST到API
這篇入門文章的場景是允許客戶端添加、刪除和更新系統的聯系人。
1、解壓啟動器代碼
要快速開始練習,請到這里下載代碼,下載解壓后,打開Start目錄下的ContactManager項目。代碼和入門:構建簡單的Web API的主要區別是實體代碼重構到一個內存 ContactManagerRepository。
public interface IRepository<T>
{
T Find(int id);
IQueryable<T> FindAll();
void Add(T entity);
void Remove(int id);
void Save();
}
using System;
using System.Collections.Generic;
using System.Linq;
using ContactManager.Repositories;
namespace ContactManager.Infrastructure
{
public abstract class InMemoryRepository<T> : IRepository<T> where T:new()
{
protected List<T> entities;
protected int nextId;
static InMemoryRepository<T> instance;
static object lockObject = new object();
public T Find(int id)
{
return entities.SingleOrDefault(e => IsEntityWithId(e, id));
}
public IQueryable<T> FindAll()
{
return entities.AsQueryable();
}
public void Add(T entity)
{
OnAdd(entity, nextId++);
entities.Add(entity);
}
public void Remove(int id)
{
entities.RemoveAll(e => IsEntityWithId(e, id));
}
public void Save()
{
throw new InvalidOperationException();
}
protected abstract bool IsEntityWithId(T contact, int id);
protected abstract void OnAdd(T entity, int newId);
}
}
using ContactManager.Infrastructure;
using ContactManager.Resources;
namespace ContactManager.Repositories
{
public interface IContactRepository : IRepository<Contact>
{
}
}
2、啟用檢索一個單一的資源并和HttpResponseException協同工作
目前我們的API只支持獲取一個聯系人集合。另一個通常的場景是通過一個URI返回一個單一的資源,如果找不到相關的資源應該返回一個404狀態碼。
- 打開ContactsAp.cs
- 復制以下方法
[WebGet(UriTemplate="{id}")]
public Contact GetItem(int id)
{
var contact = repository.Find(id);
if (contact == null)
throw new HttpResponseException(HttpStatusCode.NotFound);
return contact;
}
- 注意GET方法接受一個ID參數映射到{id} uri模板參數。如果你的請求API是http://localhost:9000/api/contacts/1 的ID將被設置為1,Web API支持將模板參數自動轉換為原生類型int。
- 如果聯系人不存在,就拋出HttpResponseException 并設置狀態碼
- 編譯并運行(F5)
- 打開Fiddler并在“Request builder”欄輸入地址“http://localhost:9000/api/contacts/1”
- 拷貝以下內容到header
Accept: application/json
- 運行執行按鈕,Contract 1按json格式返回
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 19 Jul 2011 13:04:26 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 35
Cache-Control: private
Content-Type: application/json; charset=utf-8
Connection: Close
{"ContactId":1,"Name":"Phil Haack"}
3、添加對POST的支持
以下代碼是添加一個新的Post方法,添加一個新的Contract
[WebInvoke(UriTemplate = "", Method="POST")]
public Contact Post(Contact contact)
{
repository.Add(contact);
return contact;
}
-
運行項目
-
啟動Fiddler并切換到“Request Builder”
-
選擇“POST”方法,輸入以下Uri:http://localhost:9000/api/contacts
-
拷貝以下內容到“Request Headers”
Accept: application/json
Content-Type: application/json
-
按下“Execute”,返回Json格式的新的Contact ,id為7
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 19 Jul 2011 13:12:57 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 36
Cache-Control: private
Content-Type: application/json; charset=utf-8
Connection: Close
{"ContactId":7,"Name":"New Person1"}
5、以XML格式發送數據
-
以xml方式發布,需要替換“Request Headers”為以下內容
Content-Type: application/xml
Accept: application/xml -
替換“Request Body”為以下內容
<Contact>
<Name>New Person2</Name>
</Contact>
- 按下“Execute”,然后雙擊左窗格中的結果,選擇“RAW”標簽,返回的結果應該是XML,并顯示創建了ID為8的一個聯系人
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 19 Jul 2011 13:25:50 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 105
Cache-Control: private
Content-Type: application/xml; charset=utf-8
Connection: Close
<?xml version="1.0" encoding="utf-8"?><Contact><ContactId>8</ContactId><Name>New Person2</Name></Contact>
6、從一個簡單的HTML表單發送內容
Web API包含從HTML表單的內容發送的直接支持,下面,你添加一個ContactsContrller和相應的View,通過一個HTML表單向Web API發送請求并創建一個Contact
- 右鍵單擊項目并選擇添加Contrller,輸入名字為ContactsController 并按下添加
- 拷貝以下代碼到ContactsController
public ActionResult Create()
{
return View();
}
-
右鍵Create方法選擇 Add-〉New View,并按下”Enter”
-
打開“Create.cshtml”并把以下代碼貼進去
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Create new Contact</title>
</head>
<body>
<h1>Create new Contact</h1>
<form method="post" action="/api/contacts" id="addContact"
enctype="application/x-www-form-urlencoded">
<table>
<tr>
<td>
Name
</td>
<td>
<input type="text" name="Name" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Add" />
</td>
</tr>
</table>
</form>
</body>
</html>
-
運行項目,在瀏覽器里輸入http://localhost:9000/contacts/create 加載創建Contact頁面,輸入“NewContact”按下Create
-
創建的Contact被返回
-
7、添加PUT的支持
添加對PUT和DELETE的支持是非常容易的,像POST一樣也是使用WebInvoke 制定PUT和DELETE
-
打開ConactApi.cs把以下代碼拷進去
[WebInvoke(UriTemplate ="{id}", Method = "PUT")]和DELETE類似,PUT方法在沒有找到Contact的情況下,返回一個404狀態碼
public Contact Put(Contact contact, int id)
{
var existingContact = repository.Find(id);
if (existingContact == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
existingContact.Name = contact.Name;
return existingContact;
}
-
編譯運行(F5)
-
啟動Fiddler,并切換到“Request Builder”,設置方法為PUT,輸入http://localhost:9000/api/contacts/1,在Request Header輸入以下內容
Content-Type: application/json
-
拷貝以下內容到“Request Body”
{
"Name":"Updated Contact"
}
-
按下“Execute”
-
被更新的contact返回,結果如下表明PUT成功
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 19 Jul 2011 13:50:28 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 40
Cache-Control: private
Content-Type: application/json; charset=utf-8
Connection: Close
{"ContactId":1,"Name":"Updated Contact"
8、添加對DELETE的支持
- 切換到ContactApi.cs并復制以下內容:
[WebInvoke(UriTemplate = "{id}", Method = "DELETE")]
public Contact Delete(int id)
{
var contact = repository.Find(id);
if (contact == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
repository.Remove(id);
return contact;
}
-
運行項目(F5)
-
在Fiddler 上把方法切換為DELETE,URL 為輸入http://localhost:9000/api/contacts/1,結果如下表明PUT成功
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 19 Jul 2011 13:55:23 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 40
Cache-Control: private
Content-Type: application/json; charset=utf-8
Connection: Close
{"ContactId":1,"Name":"Updated Contact"}
-
切換Fiddler的方法為GET,然后執行,返回狀態碼為404
HTTP/1.1 404 Not Found
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 19 Jul 2011 13:58:08 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: private
Content-Length: 0
Connection: Close
-
再次切換方法為DELETE,然后執行,也返回狀態碼404
總結:在這篇入門文章里我們學習了以下內容:
- 如何添加檢索一個單一的資源
- 如何設置一個方法返回一個404 處理異常情況下的HTTP 響應。
- 如何支持POST和URL編碼形式。
- 如何支持PUT和DELETE。
歡迎大家掃描下面二維碼成為我的客戶,扶你上云


浙公網安備 33010602011771號