入门 ASP.NET Web API 2 (C#)

HTTP 不只是为了生成 web 页面。它也是一个强大的建设公开服务和数据 Api的平台。

HTTP 的特性:简单、 灵活和无处不在。你能想到的几乎任何平台都有 HTTP 库,因此,HTTP 服务可以延伸到大范围的客户端应用,包括浏览器、 移动设备和传统的桌面应用程序。

ASP.NET Web API 是用于生成基于.NET framework的web框架--- web Api。

在本教程中,您将使用 ASP.NET Web API 创建的 web API 返回的产品列表。

注意:前端的 web 页使用 jQuery 来显示结果,要有一些jquery功底。

Download the completed project.

要求

此示例使用开发工具: Visual Studio 2013.

第一步:

启动 Visual Studio 时,从开始页中选择新的项目。或者,从文件菜单中,选择新建,然后项目。在模板窗格中,选择已安装的模板和展开 Visual C# 节点。在 Visual C# 中,请选择 Web。在项目模板的列表中,选择 ASP.NET Web 应用程序。命名项目"ProductsApp"并单击确定。

第二步:

在新的 ASP.NET 项目对话框中,选择空模板。根据"添加文件夹和核心的引用文件",选择“ Web API”。单击确定。

您还可以创建一个 Web API 项目,利用"Web API"模板。Web API 模板使用 ASP.NET MVC 提供 API 的帮助页

添加Model

模型是一个表示您的应用程序中数据的对象。ASP.NET Web API 可以自动序列化您的Model成 JSON、 XML 或一些其他格式,然后将序列化的数据写入到 HTTP 响应消息的正文中。只要客户端可以读取序列化格式,并且它可以反序列化该对象。大多数客户端可以解析 XML 或 JSON。此外,客户端也可以通过 HTTP 请求消息中设置的接受标头设置表明它想要哪一种格式。

让我们首先创建一个代表一种产品的简单模型。
如果解决方案资源管理器不可见,请单击视图菜单,然后选择解决方案资源管理器。在解决方案资源管理器中,右键单击“模型文件夹”。从上下文菜单中,选择“添加”,然后选择“类(class)”。
 

类命名"Product"。将以下属性添加到"Product"类。

  1. namespace ProductsApp.Models
  2. {
  3. public class Product
  4. {
  5. public int Id { get; set; }
  6. public string Name { get; set; }
  7. public string Category { get; set; }
  8. public decimal Price { get; set; }
  9. }
  10. }

添加控制器(Controller)

在 Web API 中,控制器是处理 HTTP 请求的对象。我们将添加一个控制器,可以返回由 ID 指定的单个产品的列表

注意:如果您使用了 ASP.NET MVC 中,您已经熟悉控制器。Web API 控制器类似于 MVC 控制器(controller),但是继承 ApiController 类,而不是控制器类。

在解决方案资源管理器中,右键单击控制器文件夹。选择Add(添加),然后选择controller(控制器)。

在添加Scaffold dialog 中,选择 Web API Controller - Empty。单击添加。

在添加控制器对话框中,名称"ProductsController"的控制器。单击添加。

随即创建一个名为控制器文件夹中的 ProductsController.cs 文件。

注意:你不需要放入一个命名为Controllers的文件夹,你可以选择方便的方式来存放你源文件的文件夹名称。

如果没有打开此文件,则请双击该文件以打开它。此文件中的代码替换为以下内容:

  1. using ProductsApp.Models;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Web.Http;
  7. namespace ProductsApp.Controllers
  8. {
  9. public class ProductsController : ApiController
  10. {
  11. Product[] products = new Product[]
  12. {
  13. new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
  14. new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
  15. new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
  16. };
  17. public IEnumerable<Product> GetAllProducts()
  18. {
  19. return products;
  20. }
  21. public IHttpActionResult GetProduct(int id)
  22. {
  23. var product = products.FirstOrDefault((p) => p.Id == id);
  24. if (product == null)
  25. {
  26. return NotFound();
  27. }
  28. return Ok(product);
  29. }
  30. }

为保持示例简单,产品都存储在一个固定的数组,在控制器类的内部。当然,在实际的应用中,将从数据库中查询或使用一些其他外部数据源。控制器定义返回的产品的两种方法:GetAllProducts 方法返回的产品的整个列表 IEnumerable <Product>作为类型。GetProductById 方法查找单个产品由其 id。就这么简单 !你有工作 web API。每个控制器上的方法对应于一个或多个 Uri:

为保持示例简单,产品都存储在在控制器类的内部的一个固定的数组,。当然,在实际的应用中,是从数据库中查询或使用一些其他外部数据源。

控制器定义返回产品的两种方法:

  • GetAllProducts 方法返回的产品是以IEnumerable <Product>作为返回类型的整个列表  。
  • GetProductById 方法查找单个产品由其 id。

就这么简单 !你有了一个可以使用的 web API了。每个控制器上的方法对应于一个或多个 Uri:

Controller Method URI
GetAllProducts /api/products
GetProductById /api/products/id

对于 GetProductByID 的方法,在 URI 中的 id 是一个占位符。例如,若要获得具有 ID 为 5 的产品,URI 是 api/products/5。有关 Web API 如何将 HTTP 请求路由到控制器方法的详细信息,将在后续文章中列出,敬请期待。

采用 Javascript 和 jQuery调用Web API

在本节中,我们将添加一个 HTML 页,使用 AJAX 调用 web API。我们会使用 jQuery,采用AJAX 调用,并更新该页面的结果。

在解决方案资源管理器中,右键单击该项目并选择Add,然后选择New Item。

在添加新项对话框中,选择Visual C# 中 Web 节点下,然后选择 HTML 页面项目。命名"index.html"页。

用以下内容替换此文件中的所有内容:

  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title>Product App</title>
  5. </head>
  6. <body>
  7. <div>
  8. <h2>All Products</h2>
  9. <ul id="products" />
  10. </div>
  11. <div>
  12. <h2>Search by ID</h2>
  13. <input type="text" id="prodId" size="5" />
  14. <input type="button" value="Search" onclick="find();" />
  15. <p id="product" />
  16. </div>
  17. <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
  18. <script>
  19. var uri = 'api/products';
  20. $(document).ready(function () {
  21. // Send an AJAX request
  22. $.getJSON(uri)
  23. .done(function (data) {
  24. // On success, 'data' contains a list of products.
  25. $.each(data, function (key, item) {
  26. // Add a list item for the product.
  27. $('<li>', { text: formatItem(item) }).appendTo($('#products'));
  28. });
  29. });
  30. });
  31. function formatItem(item) {
  32. return item.Name + ': $' + item.Price;
  33. }
  34. function find() {
  35. var id = $('#prodId').val();
  36. $.getJSON(uri + '/' + id)
  37. .done(function (data) {
  38. $('#product').text(formatItem(data));
  39. })
  40. .fail(function (jqXHR, textStatus, err) {
  41. $('#product').text('Error: ' + err);
  42. });
  43. }
  44. </script>
  45. </body>
  46. </html>

有几种方法来获取 jQuery。在此示例中,使用 Microsoft Ajax CDN。您还可以下载它从 http://jquery.com/ 和 ASP.NET"Web API"项目模板包括 jQuery 以及。

获取产品的列表若要获取产品的列表,请将 HTTP GET 请求发送到"/ api/products"。

JQuery getJSON 函数会发送一个 AJAX 请求。对于响应包含的 JSON 对象的数组。如果指定的函数请求成功,则调用回调。在回调中,我们用的产品信息更新 DOM。

  1. $(document).ready(function () {
  2. // Send an AJAX request
  3. $.getJSON(apiUrl)
  4. .done(function (data) {
  5. // On success, 'data' contains a list of products.
  6. $.each(data, function (key, item) {
  7. // Add a list item for the product.
  8. $('<li>', { text: formatItem(item) }).appendTo($('#products'));
  9. });
  10. });
  11. });

获得产品的 ID

若要获取产品的 ID,发送 HTTP GET 请求到"/ products/id 的 api",id 就是产品 id。

  1. function find() {
  2. var id = $('#prodId').val();
  3. $.getJSON(apiUrl + '/' + id)
  4. .done(function (data) {
  5. $('#product').text(formatItem(data));
  6. })
  7. .fail(function (jqXHR, textStatus, err) {
  8. $('#product').text('Error: ' + err);
  9. });
  10. }

我们仍然使用 getJSON 发送 AJAX 请求,但这次我们把 ID 放在请求的 URI。请求之后返回的是一个用JSON 表示的单一产品 。

运行应用程序

按 F5 启动调试应用程序。在 web 页应如下所示:

若要获取产品的 ID,输入了 ID 并单击搜索:

使用 f12 键以查看 HTTP 请求和响应

当您正在使用 HTTP 服务时,它可以看到 HTTP 请求和请求消息非常有用。
你可以通过Internet Explorer 9 中使用 F12 开发人员工具。
从Internet Explorer9,按 f12 键以打开工具。单击网络选项卡,然后按开始捕获。现在回到 web 页,请按 F5 重新加载该 web 页。Internet Explorer中将捕获浏览器和 web 服务器之间的 HTTP 通信。摘要视图显示页的所有网络通信:

找到对应的条目相对 uri"api/products /"。选择此项,然后单击转到详细信息视图。在详细信息视图中,有选项卡以查看请求和响应的邮件标题和正文。

例如,如果您单击Request headers 选项卡,您可以看到客户端请求"application//json"接受标头中。

如果您单击Response 选项卡,您可以看到如何产品列表中被序列化为 JSON。其他浏览器都有类似的功能。 Fiddler,web 调试代理是另一个有用的工具。你可以使用Fiddler以查看您的 HTTP 流量,并完全控制你在请求中的 HTTP headers  。

最新文章

  1. ASP.NET MVC的客户端验证:jQuery验证在Model验证中的实现
  2. [LintCode] Maximum Depth of Binary Tree 二叉树的最大深度
  3. Python 面向对象(初级篇)
  4. DbExpressionBinding requires an input expression with a collection ResultType. 参数名: input
  5. java 求 两个数的百分比% (转)
  6. spring task定时器笔记
  7. 【LEETCODE OJ】Single Number II
  8. Asp.net 上传图片添加半透明图片或者文字水印的方法
  9. springMVC项目在jboss7中配置应用自己的log4j--转载
  10. NSValue NSNumber NSData类
  11. HUST 1601 Shepherd
  12. UVa 311 - Packets
  13. Android studio 常见错误修改
  14. ubuntu18.04使用SPFlashTool提示缺少libpng12.so.0
  15. ---mipi command
  16. 使用==操作符比较命令行参数args[0]和字符串返回“Invalid type&quot;
  17. Oracle DbHelper
  18. uva11827 处理下输入
  19. Python学习之旅(二十八)
  20. Java:将Excel数据导入到数据库(一眼就看会)

热门文章

  1. Cocos2d-x在线粒子编辑器
  2. 一个sql的优化
  3. JavaEE(12) - JPA规范及实现(TopLink和Hibernate)
  4. Oracle语句优化1
  5. AngularJS与ASP.NET MVC登录超时解决方案
  6. Sql Server脚本使用TFS版本控制
  7. 使用ExpandableListView时间轴效果达到
  8. 乘法逆元...Orz
  9. three.js 来源目光(十三)Math/Ray.js
  10. C# Windows服务的创建、安装、调试