一、介紹
WebAPI是一種用於構建HTTP服務的框架,支持多種格式的數據傳輸和HTTP請求類型。
使用C# WebAPI,開發人員可以快速創建RESTful Web服務,讓任何可以發送HTTP請求的設備與您的應用程序進行通信。
本文將深入探討C# WebAPI的各個方面,包括如何建立WebAPI、處理HTTP請求、使用內容協商、異常處理以及如何測試WebAPI等方面。
二、建立WebAPI
C# WebAPI可以使用Visual Studio輕鬆創建。可以選擇創建ASP.NET Web應用程序並選擇Web API模板。該模板提供許多常見任務的支持,如添加新的控制器、配置路由、添加模型綁定、處理請求等。
public class BooksController : ApiController { public IEnumerable Get() { return new List() { new Book() { Id = 1, Title = "Book1" }, new Book() { Id = 2, Title = "Book2" }, new Book() { Id = 3, Title = "Book3" } }; } }
在這個例子中,我們創建了一個名為「BooksController」的控制器,並且在該控制器中實現了「GET」方法。當我們訪問API的根路徑時,即「/api/books」時,我們將會得到一個包含三個書籍對象的JSON格式的響應。
三、處理HTTP請求
C# WebAPI支持HTTP請求類型,如POST、GET、PUT、DELETE 等。可以通過使用屬性或UriParameter(具有[FromUri]或[FromBody]屬性的參數)將請求中的數據綁定到C#對象上。
下面是一個使用POST方法向WebAPI提交請求的例子。
[HttpPost] public IHttpActionResult Create([FromBody]Book book) { // 將書籍保存到資料庫 return Ok(); }
在這個例子中,我們使用HttpPost特性來標記Create方法,使其能夠響應POST請求。 我們還使用FromBody屬性將請求正文中的數據綁定到Book對象並保存到資料庫中。
四、使用內容協商
內容協商是C# WebAPI中優秀的特性之一,它可允許您根據客戶端能夠處理的數據格式來提供不同的響應。可以使用Accept Header來實現內容協商。
public IEnumerable Get() { var books = new List() { new Book() { Id = 1, Title = "Book1" }, new Book() { Id = 2, Title = "Book2" }, new Book() { Id = 3, Title = "Book3" } }; if (Request.Headers.Accept.Any(x => x.MediaType.Contains("application/xml"))) { var xmlBooks = new List(); books.ForEach(x => xmlBooks.Add(new BookXml() { Id = x.Id, Title = x.Title })); return xmlBooks; } return books; }
在這個例子中,我們檢查Accept Header是否包含「application/xml」媒體類型,如果包含則返回XML格式的響應。否則,我們返回JSON格式的響應。
五、異常處理
C# WebAPI提供了多種處理異常的方法。以下是一種使用HttpResponseException的簡單方法,用於返回HTTP錯誤代碼和自定義消息。
public IHttpActionResult Get(int id) { var book = _books.FirstOrDefault(x => x.Id == id); if (book == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } return Ok(book); }
在這個例子中,如果找不到包含給定ID的書,則拋出HttpResponseException。該異常將返回HTTP 404錯誤代碼。
六、測試WebAPI
測試WebAPI可能是開發應用程序的最重要部分。WebAPI測試應該包括設置路由、模型綁定、請求消息構造和響應消息讀取。你可以使用Microsoft.AspNet.WebApi.Testing包來輕鬆測試你的WebAPI.
[TestClass] public class BooksControllerTests { [TestMethod] public void TestGetMethod() { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); HttpServer server = new HttpServer(config); HttpClient client = new HttpClient(server); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = client.GetAsync("http://localhost/api/Books").Result; response.EnsureSuccessStatusCode(); string responseBody = response.Content.ReadAsStringAsync().Result; Assert.AreEqual("[{\"Id\":1,\"Title\":\"Book1\"},{\"Id\":2,\"Title\":\"Book2\"},{\"Id\":3,\"Title\":\"Book3\"}]", responseBody); } }
在這個例子中,我們創建了一個名為BooksControllerTests的測試類。在該類中,我們使用能夠使用默認值的HttpConfiguration實例和HttpServer實例來設置路由。我們還設置了客戶端請求頭以驗證WebAPI是否正確返回JSON格式的響應。 最後,我們使用GetAsync方法向其發送HTTP GET請求,並驗證響應是否與我們預期的結果相等。
總結
在本文中,我們深入探討了C# WebAPI的多個方面。我們學習了如何創建WebAPI、處理HTTP請求、使用內容協商、異常處理以及如何測試WebAPI。WebAPI是開發WebService和Web應用程序的強大工具,它是.NET生態系統中不可或缺的一部分。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/153046.html