在C#中,傳統(tǒng)調(diào)用HTTP接口一般有兩種辦法:
- WebRequest/WebResponse組合的方法調(diào)用
- WebClient類進行調(diào)用。
第一種方法抽象程度較低尉咕,使用較為繁瑣坡慌;而WebClient主要面向了WEB網(wǎng)頁場景熬拒,在模擬Web操作時使用較為方便,但用在RestFul場景下卻比較麻煩,在Web API發(fā)布的同時,.NET提供了兩個程序集:
System.Net.Http
和System.Net.Http.Formatting
咒钟。這兩個程序集中最核心的類是HttpClient
。在.NET4.5中帶有這兩個程序集若未,而.NET4需要到Nuget里下載Microsoft.Net.Http和Microsoft.AspNet.WebApi.Client這兩個包才能使用這個類朱嘴,更低的.NET版本就只能表示遺憾了只能用WebRequest/WebResponse或者WebClient來調(diào)用這些API了。
在使用中粗合,System.Net.Http這個程序集提供了HttpClient類以及相關(guān)的HTTP調(diào)用腕够,而System.Net.Http.Formatting提供了一些針對HttpClient的幫助擴展,更好地支持了內(nèi)容協(xié)商舌劳、Content創(chuàng)建等功能。下面我就和大家一起寫一下這個例子:
public class Person
{
public long Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
public override string ToString()
{
return $"Id={Id} Name={Name} Age={Age} Sex={Sex}";
}
}
class Program
{
static void Main(string[] args)
{
var client = new HttpClient();
//基本的API URL
client.BaseAddress = new Uri("http://localhost:22658/");
//默認希望響應使用Json序列化(內(nèi)容協(xié)商機制玫荣,我接受json格式的數(shù)據(jù))
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//運行client接收程序
Run(client);
Console.ReadLine();
}
//client接收處理(都是異步的處理)
static async void Run(HttpClient client)
{
//post 請求插入數(shù)據(jù)
var result = await AddPerson(client);
Console.WriteLine($"添加結(jié)果:{result}"); //添加結(jié)果:true
//get 獲取數(shù)據(jù)
var person = await GetPerson(client);
//查詢結(jié)果:Id=1 Name=test Age=10 Sex=F
Console.WriteLine($"查詢結(jié)果:{person}");
//put 更新數(shù)據(jù)
result = await PutPerson(client);
//更新結(jié)果:true
Console.WriteLine($"更新結(jié)果:{result}");
//delete 刪除數(shù)據(jù)
result = await DeletePerson(client);
//刪除結(jié)果:true
Console.WriteLine($"刪除結(jié)果:{result}");
}
//post
static async Task<bool> AddPerson(HttpClient client)
{
//向Person發(fā)送POST請求甚淡,Body使用Json進行序列化
return await client.PostAsJsonAsync("api/Person", new Person() { Age = 10, Id = 1, Name = "test", Sex = "F" })
//返回請求是否執(zhí)行成功,即HTTP Code是否為2XX
.ContinueWith(x => x.Result.IsSuccessStatusCode);
}
//get
static async Task<Person> GetPerson(HttpClient client)
{
//向Person發(fā)送GET請求
return await await client.GetAsync("api/Person/1")
//獲取返回Body捅厂,并根據(jù)返回的Content-Type自動匹配格式化器反序列化Body內(nèi)容為對象
.ContinueWith(x => x.Result.Content.ReadAsAsync<Person>(
new List<MediaTypeFormatter>() {new JsonMediaTypeFormatter()/*這是Json的格式化器*/
,new XmlMediaTypeFormatter()/*這是XML的格式化器*/}));
}
//put
static async Task<bool> PutPerson(HttpClient client)
{
//向Person發(fā)送PUT請求贯卦,Body使用Json進行序列化
return await client.PutAsJsonAsync("api/Person/1", new Person() { Age = 10, Id = 1, Name = "test1Change", Sex = "F" })
.ContinueWith(x => x.Result.IsSuccessStatusCode); //返回請求是否執(zhí)行成功,即HTTP Code是否為2XX
}
//delete
static async Task<bool> DeletePerson(HttpClient client)
{
return await client.DeleteAsync("api/Person/1") //向Person發(fā)送DELETE請求
.ContinueWith(x => x.Result.IsSuccessStatusCode); //返回請求是否執(zhí)行成功焙贷,即HTTP Code是否為2XX
}
}
這就完成了這組API的調(diào)用撵割,是不是非常簡單方便?HTTPClient使用全異步的方法辙芍,并且他有良好的擴展性啡彬,我會在之后的博客中再聊這個問題羹与。
OK,到此為止一組簡單的Restful API和C#的調(diào)用客戶端就完成了庶灿,但這只是開始纵搁,Web API是一個很強大的框架,他的擴展點非常豐富往踢,這些擴展能為我們的開發(fā)提供很多的幫助腾誉,下一篇博文我將為大家?guī)鞼EB API中Filter的使用。