入門:構(gòu)建簡單的Web API
WCF Web API支持多個宿主環(huán)境:自宿主(windows服務(wù)或者控制臺)和IIS宿主(asp.net webform/mvc)。這個入門文章主要演示在ASP.NET MVC3網(wǎng)站宿主:
- 如何使用NuGet向項目中添加Web Api引用
- 如何創(chuàng)建一個通過HTTP GET訪問的Web Api
- 如何通過asp.net routes宿主一個Web Api
- 如何通過瀏覽器或者Fiddler訪問Web Api
- 如何在Api上啟用OData uri查詢
- 如何用WCF Web Test Client測試WCF Web API
1、創(chuàng)建一個基本的解決方案:使用VS2010新建一個空的ASP.NET MVC 3 Web Application
設(shè)置站點的端口號為9000
2、向解決方案中加入Web Api的引用
通過NuGet來添加Web api的程序集引用,右擊項目屬性,選擇“Manage NuGet Packages”
在NuGet管理擴(kuò)展器上查詢Online的”webapi.all“
選擇安裝,NuGet就會下載所有所需的軟件包,現(xiàn)在可以開始開發(fā)Web Api。
3、創(chuàng)建一個Contacts Api類
右擊項目ContactManager選擇添加一個文件夾,取名”APIs“,然后在APIs文件夾上右擊添加類,類名叫做ContactsApi:
using System.ServiceModel;
namespace ContactManager.APIs
{
[ServiceContract]
public class ContactsApi
{
}
}
using ContactManager.APIs;
using System.ServiceModel.Activation;
routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));下面的黃色部分很重要,MVC的默認(rèn)路由是映射到controller + action
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}MapServiceRoute需要一個泛型參數(shù)指定服務(wù)(API),以及一個將被追加到IIS base url的路徑。在這里,我們指定的“contacts”,也就是宿主為“http://localhost:9000/api/contacts”。
5. 通過一個HTTP Get 方法暴露contacts:首先創(chuàng)建一個poco(Plain Old C#)Contract類,代表我們在api上傳遞的聯(lián)系人,本質(zhì)上就是一個DTO(數(shù)據(jù)傳輸對象),在HTTP上我們把它作為資源,然后創(chuàng)建一個HTTP Get方法暴露資源。
右擊項目ContactManager項目選擇添加新的文件夾“Resources”,在Resources文件下創(chuàng)建一個新的類Contact。
namespace ContactManager.Resources
{
public class Contact
{
public int ContactId { get; set; }
public string Name { get; set; }
}
}
返回到ContactApi類,添加下述引用:
using System.ServiceModel.Web;
using ContactManager.Resources;
添加一個Get方法返回所有的contracts
[WebGet(UriTemplate = "")]
public IQueryable<Contact> Get()
{
var contacts = new List<Contact>()
{
new Contact {ContactId = 1, Name = "Phil Haack"},
new Contact {ContactId = 2, Name = "HongMei Ge"},
new Contact {ContactId = 3, Name = "Glenn Block"},
new Contact {ContactId = 4, Name = "Howard Dierking"},
new Contact {ContactId = 5, Name = "Jeff Handley"},
new Contact {ContactId = 6, Name = "Yavor Georgiev"}
};
return contacts.AsQueryable();
}
Get方法上加了WebGet Attribute表示這是一個HTTP Get。注意這里的UriTemplate被設(shè)置為“”,默認(rèn)情況下,操作的Uri是方法名Get,在這種情況下,我們是在Route中設(shè)置的Uri。
6、通過瀏覽器查詢Contracts.按F5運行項目,然后再瀏覽器地址欄中輸入http://localhost:9000/api/contacts
7、查詢返回Json格式的Contracts。HTTP提供了一些“內(nèi)容協(xié)商”機(jī)制 — 當(dāng)有多個可得的表現(xiàn)形式的時候,對特定的響應(yīng)選擇最好的表現(xiàn)形式的處理過程。
服務(wù)器驅(qū)動協(xié)商(Server-driven Negotiation)
如果響應(yīng)的最好的表現(xiàn)形式的選擇是通過服務(wù)器上的算法來實現(xiàn),那么這種方式的協(xié)商稱做服務(wù)器驅(qū)動協(xié)商。選擇是基于響應(yīng)可得的表現(xiàn)形式(根據(jù)不同的維度,響應(yīng)會不同;例如,語言,內(nèi)容編碼,等等)和請求消息里特定的頭域或關(guān)于請求的其他信息(如:網(wǎng)絡(luò)客戶端的地址)。
服務(wù)器驅(qū)動協(xié)商是有優(yōu)點的,當(dāng)從可行的表現(xiàn)形式里進(jìn)行選擇的算法對用戶代理進(jìn)行描述是比較困難的時候,或者當(dāng)服務(wù)器期望發(fā)送“最好的猜測”給客戶端而只通過一個響應(yīng)(以避免后續(xù)請求的回路(一個請求會返回一個響應(yīng))延遲如果此“最好的猜測“對用戶適合的時候)的時候。為了改善服務(wù)器的猜測,用戶代理應(yīng)該包含請求頭域(Accept,Accept-Language,Accept-Encoding,等等),這些頭域能描述它對響應(yīng)的喜好。
Web api返回的響應(yīng)很容易添加一種媒體類型(media types )。
打開Fiddler,在“Request builder”欄輸入地址“http://localhost:9000/api/contacts”,然后移動到“Request Headers”在“User-Agent” 項下方添加 “Accept: application/json”
按下 Exectue按鈕,雙擊左邊的Panel查看HTTP的response,切換到“Raw”Tab,你可以看到下面的json格式的數(shù)據(jù):
8、啟用OData 查詢支持
Web API支持OData協(xié)議,接受OData的URI格式查詢,當(dāng)OData 查詢到達(dá)Web Api, 在返回客戶端之前在服務(wù)端會進(jìn)行必要的過濾和排序。查詢使用IQueryable 接口,服務(wù)端并沒有去查詢所有的數(shù)據(jù),發(fā)送過濾和排序到服務(wù)端。
return contacts.AsQueryable();
運行程序,在瀏覽器里輸入 http://localhost:9000/api/contacts?$Top=4&$OrderBy=Name ,看到瀏覽器之返回了按名字排序的top 4個contract
也可以通過Fidder去查詢,具體可參照第7步。
9、WCF Web API也提供了一個WCF Web Test Client用于測試WCF Web API,通過配置啟用,在RegisterRoutes方法里創(chuàng)建HttpConfiguration 實例,并設(shè)置EnableTestClient屬性為True:
var config = new HttpConfiguration() { EnableTestClient = true };
然后把HttpConfiguration實例傳遞給HttpServiceHostFactory的配置屬性
routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory() { Configuration = config }, typeof(ContactsApi)));
按下F5 啟動調(diào)試項目,然后再瀏覽器后面加入/Test
總結(jié)
通過這個Quick start,我們學(xué)習(xí)到了以下內(nèi)容
- 如何使用NuGet向項目中添加Web Api引用
- 如何創(chuàng)建一個通過HTTP GET訪問的Web Api
- 如何通過asp.net routes宿主一個Web Api
- 如何通過瀏覽器或者Fiddler訪問Web Api
- 如何在Api上啟用OData uri查詢
- 如何用WCF Web Test Client測試WCF Web API
你可以在這里獲取到代碼。
2011-10-4日更新到WebAPI 0.5 Preview
歡迎大家掃描下面二維碼成為我的客戶,扶你上云





浙公網(wǎng)安備 33010602011771號