網站首頁 編程語言 正文
本篇體驗使用HttpClient對ASP.NET Web API服務實現增刪改查。
創建ASP.NET Web API項目
新建項目,選擇"ASP.NET MVC 4 Web應用程序"。
選擇"Web API"。
在Models文件夾下創建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文件夾下創建IProductRepository接口。
public interface IProductRepository { IEnumerable<Product> GetAll(); Product Get(int id); Product Add(Product item); void Remove(int id); bool Update(Product item); }
在Models文件夾下創建ProductRepository類,實現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文件夾下創建空的ProductController。
public class ProductController : ApiController { static readonly IProductRepository repository = new ProductRepository(); //獲取所有 public IEnumerable<Product> GetAllProducts() { return repository.GetAll(); } //根據id獲取 public Product GetProduct(int id) { Product item = repository.Get(id); if (item == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } return item; } //根據類別查找所有產品 public IEnumerable<Product> GetProductsByCategory(string category) { return repository.GetAll().Where(p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase)); } //創建產品 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查詢某個產品
在同一個解決方案下創建一個控制臺程序。
依次點擊"工具","庫程序包管理器","程序包管理器控制臺",輸入如下:
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")); //異步獲取數據 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類型的參數,支持 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")); //異步獲取數據 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); //異步獲取數據 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); } //異步獲取數據 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); } //異步獲取數據 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); } } } }
原文鏈接:https://www.cnblogs.com/darrenji/p/4437680.html
相關推薦
- 2023-05-13 python中flatten()函數用法詳解_python
- 2022-07-09 Dockerfile文件介紹
- 2022-12-29 Android開發中用Kotlin編寫LiveData組件教程_Android
- 2022-12-13 Android?Loop機制中Looper與handler詳細分析_Android
- 2022-06-06 flutter 布局管理詳解
- 2022-07-15 C++?DLL動態庫的創建與調用(類庫,隱式調用)_C 語言
- 2023-01-03 python中import和from-import的區別解析_python
- 2022-07-25 python數據清洗中的時間格式化實現_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支