一、介绍
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 IEnumerableGet() { 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 IEnumerableGet() { 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生态系统中不可或缺的一部分。