使用HttpClient增刪改查ASP.NET Web API服務
本篇體驗使用HttpClient對ASP.NET Web API服務實現(xiàn)增刪改查。
創(chuàng)建ASP.NET Web API項目
新建項目,選擇"ASP.NET MVC 4 Web應用程序"。
選擇"Web API"。
在Models文件夾下創(chuàng)建Product類。
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}在Models文件夾下創(chuàng)建IProductRepository接口。
public interface IProductRepository
{
IEnumerable<Product> GetAll();
Product Get(int id);
Product Add(Product item);
void Remove(int id);
bool Update(Product item);
}在Models文件夾下創(chuàng)建ProductRepository類,實現(xiàn)IProductRepository接口。
public class ProductRepository : IProductRepository
{
private List<Product> products = new List<Product>();
private int _nextId = 1;
public ProductRepository()
{
Add(new Product() {Name = "product1", Category = "sports", Price = 88M});
Add(new Product() { Name = "product2", Category = "sports", Price = 98M });
Add(new Product() { Name = "product3", Category = "toys", Price = 58M });
}
public IEnumerable<Product> GetAll()
{
return products;
}
public Product Get(int id)
{
return products.Find(p => p.Id == id);
}
public Product Add(Product item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
item.Id = _nextId++;
products.Add(item);
return item;
}
public bool Update(Product item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
int index = products.FindIndex(p => p.Id == item.Id);
if (index == -1)
{
return false;
}
products.RemoveAt(index);
products.Add(item);
return true;
}
public void Remove(int id)
{
products.RemoveAll(p => p.Id == id);
}
}在Controllers文件夾下創(chuàng)建空的ProductController。
public class ProductController : ApiController
{
static readonly IProductRepository repository = new ProductRepository();
//獲取所有
public IEnumerable<Product> GetAllProducts()
{
return repository.GetAll();
}
//根據(jù)id獲取
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return item;
}
//根據(jù)類別查找所有產品
public IEnumerable<Product> GetProductsByCategory(string category)
{
return
repository.GetAll().Where(p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase));
}
//創(chuàng)建產品
public HttpResponseMessage PostProduct(Product item)
{
item = repository.Add(item);
var response = Request.CreateResponse(HttpStatusCode.Created, item);
string uri = Url.Link("DefaultApi", new {id = item.Id});
response.Headers.Location = new Uri(uri);
return response;
}
//更新產品
public void PutProduct(int id, Product product)
{
product.Id = id;
if (!repository.Update(product))
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
//刪除產品
public void DeleteProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
repository.Remove(id);
}
}在瀏覽器中輸入:
http://localhost:1310/api/Product 獲取到所有產品
http://localhost:1310/api/Product/1 獲取編號為1的產品
使用HttpClient查詢某個產品
在同一個解決方案下創(chuàng)建一個控制臺程序。
依次點擊"工具","庫程序包管理器","程序包管理器控制臺",輸入如下:
Install-Package Microsoft.AspNet.WebApi.Client

在控制臺程序下添加Product類,與ASP.NET Web API中的對應。
public class Product
{
public string Name { get; set; }
public double Price { get; set; }
public string Category { get; set; }
}編寫如下:
static void Main(string[] args)
{
RunAsync().Wait();
Console.ReadKey();
}
static async Task RunAsync()
{
using (var client = new HttpClient())
{
//設置
client.BaseAddress = new Uri("http://localhost:1310/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//異步獲取數(shù)據(jù)
HttpResponseMessage response = await client.GetAsync("/api/Product/1");
if (response.IsSuccessStatusCode)
{
Product product = await response.Content.ReadAsAsync<Product>();
Console.WriteLine("{0}\t{1}元\t{2}",product.Name, product.Price, product.Category);
}
}
}把控制臺項目設置為啟動項目。

HttpResponseMessage的IsSuccessStatusCode只能返回true或false,如果想讓響應拋出異常,需要使用EnsureSuccessStatusCode方法。
try
{
HttpResponseMessage response = await client.GetAsync("/api/Product/1");
response.EnsureSuccessStatusCode();//此方法確保響應失敗拋出異常
}
catch(HttpRequestException ex)
{
//處理異常
}另外,ReadAsAsync方法,默認接收MediaTypeFormatter類型的參數(shù),支持 JSON, XML, 和Form-url-encoded格式,如果想自定義MediaTypeFormatter格式,參照如下:
var formatters = new List<MediaTypeFormatter>() {
new MyCustomFormatter(),
new JsonMediaTypeFormatter(),
new XmlMediaTypeFormatter()
};
resp.Content.ReadAsAsync<IEnumerable<Product>>(formatters);使用HttpClient查詢所有產品
static void Main(string[] args)
{
RunAsync().Wait();
Console.ReadKey();
}
static async Task RunAsync()
{
using (var client = new HttpClient())
{
//設置
client.BaseAddress = new Uri("http://localhost:1310/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//異步獲取數(shù)據(jù)
HttpResponseMessage response = await client.GetAsync("/api/Product");
if (response.IsSuccessStatusCode)
{
IEnumerable<Product> products = await response.Content.ReadAsAsync<IEnumerable<Product>>();
foreach (var item in products)
{
Console.WriteLine("{0}\t{1}元\t{2}", item.Name, item.Price, item.Category);
}
}
}
}
使用HttpClient添加
static void Main(string[] args)
{
RunAsync().Wait();
Console.ReadKey();
}
static async Task RunAsync()
{
using (var client = new HttpClient())
{
//設置
client.BaseAddress = new Uri("http://localhost:1310/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//添加
var myProduct = new Product() { Name = "myproduct", Price = 88, Category = "other" };
HttpResponseMessage response = await client.PostAsJsonAsync("api/Product", myProduct);
//異步獲取數(shù)據(jù)
response = await client.GetAsync("/api/Product");
if (response.IsSuccessStatusCode)
{
IEnumerable<Product> products = await response.Content.ReadAsAsync<IEnumerable<Product>>();
foreach (var item in products)
{
Console.WriteLine("{0}\t{1}元\t{2}", item.Name, item.Price, item.Category);
}
}
}
}
使用HttpClient修改
static void Main(string[] args)
{
RunAsync().Wait();
Console.ReadKey();
}
static async Task RunAsync()
{
using (var client = new HttpClient())
{
//設置
client.BaseAddress = new Uri("http://localhost:1310/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//添加 HTTP POST
var myProduct = new Product() { Name = "myproduct", Price = 100, Category = "other" };
HttpResponseMessage response = await client.PostAsJsonAsync("api/product", myProduct);
if (response.IsSuccessStatusCode)
{
Uri pUrl = response.Headers.Location;
//修改 HTTP PUT
myProduct.Price = 80; // Update price
response = await client.PutAsJsonAsync(pUrl, myProduct);
}
//異步獲取數(shù)據(jù)
response = await client.GetAsync("/api/Product");
if (response.IsSuccessStatusCode)
{
IEnumerable<Product> products = await response.Content.ReadAsAsync<IEnumerable<Product>>();
foreach (var item in products)
{
Console.WriteLine("{0}\t{1}元\t{2}", item.Name, item.Price, item.Category);
}
}
}
}
使用HttpClient刪除
static void Main(string[] args)
{
RunAsync().Wait();
Console.ReadKey();
}
static async Task RunAsync()
{
using (var client = new HttpClient())
{
//設置
client.BaseAddress = new Uri("http://localhost:1310/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//添加 HTTP POST
var myProduct = new Product() { Name = "myproduct", Price = 100, Category = "other" };
HttpResponseMessage response = await client.PostAsJsonAsync("api/product", myProduct);
if (response.IsSuccessStatusCode)
{
Uri pUrl = response.Headers.Location;
//修改 HTTP PUT
myProduct.Price = 80; // Update price
response = await client.PutAsJsonAsync(pUrl, myProduct);
//刪除 HTTP DELETE
response = await client.DeleteAsync(pUrl);
}
//異步獲取數(shù)據(jù)
response = await client.GetAsync("/api/Product");
if (response.IsSuccessStatusCode)
{
IEnumerable<Product> products = await response.Content.ReadAsAsync<IEnumerable<Product>>();
foreach (var item in products)
{
Console.WriteLine("{0}\t{1}元\t{2}", item.Name, item.Price, item.Category);
}
}
}
}
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
相關文章
ASP.NET動態(tài)生成靜態(tài)頁面的實例代碼
生成靜態(tài)頁有很多好處,可以緩解服務器壓力、方便搜索網(wǎng)站搜索等等,下面介紹一下生成靜態(tài)頁的實例代碼,有需要的朋友可以參考一下2013-07-07
Hangfire在ASP.NET CORE中的簡單實現(xiàn)方法
下面小編就為大家分享一篇Hangfire在ASP.NET CORE中的簡單實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
詳解ASP.NET 生成二維碼實例(采用ThoughtWorks.QRCode和QrCode.Net兩種方式)
本篇文章主要介紹了ASP.NET 生成二維碼實例,使用了兩種方法,包括ThoughtWorks.QRCode和QrCode.Net,具有一定的參考價值,有興趣的可以了解一下。2016-12-12
淺析Repeater控件的使用 (原樣導出和動態(tài)顯示/隱藏Repeater中的列)
本文主要介紹了淺析Repeater控件的使用 (原樣導出和動態(tài)顯示/隱藏Repeater中的列)的具體方法,需要的朋友可以看下2016-12-12
基于asp.net實現(xiàn)圖片在線上傳并在線裁剪功能
本文主要介紹了基于asp.net實現(xiàn)圖片在線上傳并在線裁剪功能的具體事例代碼,具有一定的參考價值。需要的朋友可以參考下2016-12-12
一個伴隨ASP.NET從1.0到4.0的OutputCache Bug介紹
一個伴隨ASP.NET從1.0到4.0的OutputCache Bug介紹,學習.net的朋友可以參考下。2011-11-11

