C# WebAPI详解

发布时间:2023-05-16

一、介绍

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生态系统中不可或缺的一部分。