一、介绍
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<Book> Get()
{
return new List<Book>()
{
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<Book> Get()
{
var books = new List<Book>()
{
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<BookXml>();
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生态系统中不可或缺的一部分。