右键单击该项目,然后添加一个名为Api的新文件夹。然后,右键单击此文件夹,然后选择Add > New Scaffolded Item。使用Entity Framework选择带有操作的API Controller。现在选择一个现有的模型类,然后单击Add。 查看生成的控制器 生成的代码包括一个新的控制器类。类定义的顶部是两个属性。 [Route("api/[controller]")] [ApiController] public class GamesController : ControllerBase
public class GamesController : ControllerBase { private readonly AppDbContext _context; public GamesController(AppDbContext context) { _context = context; } 控制器使用现有的AppDbContext,并传递到其构造函数中。每个操作都将使用此字段来处理应用程序的数据。 // GET: api/Games [HttpGet] public IEnumerable GetGame() { return _context.Game; } 第一种方法是使用[HttpGet]属性指定的简单GET请求。它不带任何参数,并返回数据库中所有游戏的列表。 // GET: api/Games/5 [HttpGet("{id}")] public async Task GetGame([FromRoute] int id) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var game = await _context.Game.FindAsync(id); if (game == null) { return NotFound(); } return Ok(game); } 下一个方法指定路由中的{id},它将被添加到/之后的路由中,因此完整的路由将类似于api/Games/5,如顶部的注释所示。该id输入被映射到方法上的id参数。在方法内部,如果模型无效,则返回一个BadRequest结果。否则,EF将尝试查找与提供的id匹配的记录。如果找不到,将返回NotFound结果,否则将返回相应的游戏记录。 // PUT: api/Games/5 [HttpPut("{id}")] public async Task PutGame([FromRoute] int id, [FromBody] Game game) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (id != game.Id) { return BadRequest(); } _context.Entry(game).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!GameExists(id)) { return NotFound(); } else { throw; } } return NoContent(); } 接下来,使用[HttpPut]对API的请求来执行更新。新Game记录在请求的正文中提供。执行一些验证和错误检查,如果一切顺利,数据库中的记录将使用请求体中提供的值进行更新。否则,将返回适当的错误响应。 // POST: api/Games [HttpPost] public async Task PostGame([FromBody] Game game) { if (!ModelState.IsValid) { return BadRequest(ModelState); } _context.Game.Add(game); await _context.SaveChangesAsync(); return CreatedAtAction("GetGame", new { id = game.Id }, game); } 一个[HttpPost]请求用于向系统添加新记录。与[HttpPut]一样,记录被添加到请求的正文中。如果有效,则EF Core将记录添加到数据库中,并且该操作将返回更新后的记录(带有数据库生成的ID)和一个指向API记录的链接。 // DELETE: api/Games/5 [HttpDelete("{id}")] public async Task DeleteGame([FromRoute] int id) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var game = await _context.Game.FindAsync(id); if (game == null) { return NotFound(); } _context.Game.Remove(game); await _context.SaveChangesAsync(); return Ok(game); } 最后,[HttpDelete]使用带有ID 的路由来删除记录。如果请求有效,并且存在具有给定ID的记录,那么EF Core从数据库中将其删除。 添加Swagger Swagger是一个API文档和测试工具,可以作为一组服务和中间件添加到ASP.NET Core应用程序中。要做到这一点,请先右键单击该项目,然后选择Manage NuGet Packages。单击Browse,搜索Swashbuckle.AspNetCore并安装相应的软件包。 HTTP不仅仅服务于web页面,同时也是构建暴露服务和数据的API的强大平台。HTTP有着简单、灵活和无处不在的特点。你能想到的几乎所有平台都包含有一个HTTP库,所以HTTP服务可以遍及广泛的客户端,包括浏览器、移动设备和传统桌面应用程序。 ASP.NET Web API是一个在.NET框架上构建web API的框架。在本教程中,你将使用ASP.NET Web API来创建一个返回产品列表的web API。 创建Web API项目在本教程中,你将使用ASP.NET Web API来创建一个返回产品列表的web API。前端页面使用jQuery来显示结果。 开启Visual Studio并在开始页面选择New Project。或者在File目录下选择New,然后选择Project。 在Template面板中,选择Installed Templates,然后展开Visual C#节点。在Visual C#节点下,选择Web。在项目模板列表中,选择ASP.NET Web Application。命名项目为“ProductsApp”并点击OK。 在NEW ASP.NET Project对话框中,选择Empty模板。在”Add folders and core references for”,选中Web API。点击OK。 注释:你也可以用“Web API”模板来创建Web API。Web API模板使用了ASP.NET MVC来提供API的帮助页面。我在本教程中使用Empty模板是因为我希望不用MVC来展示Web API。通常,你不必了解ASP.NET MVC就能使用Web API。 添加模型模型是在你的应用程序中表示数据的对象。ASP.NET Web API能够将你的模型自动序列化成JSON、XML或其他格式,然后将其序列化数据写入到HTTP响应消息的body中。只要客户端能够读取序列化格式,它就能够反序列化出对象。几乎所有客户端都能解析XML或JSON。而且,客户端还能通过在HTTP请求的Accept header中设置来指明它想要的格式。 让我们来创建一个表示产品的简单模型吧。 如果Solution Explorer没有显示出来,点击View菜单,然后选择Solution Explorer。在Solution Explorer中,右击Models文件夹。从上下文菜单中选择Add,然后选择Class。 命名该类为“Product”。添加以下属性到Product类中。
添加控制器在Web API中,控制器(controller)是处理HTTP请求的对象。我们将添加一个能够根据ID来返回多个或一个产品的控制器。 备注:如果你还没有使用过ASP.NET MVC,你应该已经对控制器很熟悉了。Web API的控制器和MVC的控制器很相近,但是它继承的是ApiController而不是Controller。 在Solution Explorer中,右击Controllers文件夹。选择Add,然后选择Controller。 在Add Scaffold对话框中,选择Web API Controller – Empty。点击Add。 在Add Controller对话框,给控制器命名为”ProductsController”。点击Add。 接下来便会在Controllers文件夹下创建一个名为ProductsController.cs的文件。 备注:其实你不必非得把控制器添加到Controllers文件夹下。文件夹名称只是为了更方便你组织源文件。 如果文件没有打开,那就双击文件打开它。在文件中替换成以下代码:
为了让示例简单化,products被存储在控制器类中的固定数组中。当然,在实际应用程序中,你可能想要查询数据库或使用其他外部数据源。 控制器定义了两个返回产品的方法: 没错,你已经有一个可以使用的web API了。控制器上的每个方法都对应一个或多个URI: Controlle MethodURIGetAllProducts/api/productsGetProduct/api/products/id对于GetProduct方法,URI中的id是一个占位符。例如,为了得到一个ID为5的产品,URI是api/products/5。 使用JavaScript和jQuery来调用Web API在本节中,我们将添加一个使用AJAX来调用Web API的HTML页面。我们将使用jQuery来产生AJAX调用并用返回结果来更新页面。 在Solution Explorer中,右击项目并选择Add,然后选择New Item。 在Add New Item对话框中,选择Visual C#下的Web节点,然后选择HTML Page选项。命名页面为“index.html”。 用以下代码替换文件中的全部:
有好几个方法去得到jQuery。在本例中,我使用Microsoft Ajax CDN。你也可以在http://jquery.com/下载它,让ASP.NET “Web API”项目包含jQuery。 得到产品列表为了得到Products列表,可以发送一个HTTP的GET请求到“/api/products”。 jQuery的getJSON函数会发送AJAX请求。其中包含了JSON对象数组。done函数指定了一个当请求成功时触发的回调。在回调中,我们用产品信息更新DOM。
通过ID得到产品如果想要通过ID来取得产品,可以发送HTTP的GET请求到”/api/products/id“,其中id就是产品的ID。
我们仍然使用getJSON来发送AJAX请求,但是这次我们将ID放到URI请求中。它的响应会是一个代表了单个产品的JSON对象。 运行应用程序按F5开始调试应用程序,web页面看起来会是下面这样: 为了通过ID获得产品,输入ID并点击Search。 如果你输入了一个无效的ID,那么服务器就会返回HTTP错误消息。 使用F12查看HTTP请求和响应当你工作于HTTP服务时,如果能够查看HTTP请求和响应的详细无疑是非常有帮助的。你可以在IE9中使用F12开发者工具来做这些操作。在IE9中,按F12来打开工具。点击Network面板,并点击Start Capturing。现在返回到web页面,并按F5来重新加载web页面。IE将会捕捉到浏览器和web服务器之间的HTTP传输。下图显示了一个页面的所有HTTP传输。 定位到相对URI”api/products/“。选中并点击Go to detailed view。在详细视图中,这里多个面板用于查看请求和响应的header和body。 例如,如果你点击Request headers,你就会看到客户端在Accept header请求了”application/json“。 如果你点击了Response body,你就会看到产品列表如何被序列化成JSON。其他浏览器也有相似的功能。另一个有用的工具是Fiddler,它是一个web调试代理工具。你可以使用Fiddler来查看HTTP传输,也可以合成HTTP请求,后者能够给予你在请求上对于HTTP头部的完全控制。 |