首页 > 代码库 > WebApi学习笔记04:使用webapi模板--实体类--状态码--视图
WebApi学习笔记04:使用webapi模板--实体类--状态码--视图
1.Web项目
1.1概述
上一例子,我们”折腾“操作的是字符串,显然它不常用。这次我们玩一下实体类,毕竟面向对象开发是需要实体类来存储和传输数据的。
1.2创建项目
和上一例子创建项目一样:
1.3添加实体类
在Models文件夹下,添加Product.cs类,其代码:
namespace WebApi04.Models{ public class Product { public int ID { get; set; } public string Name { get; set; } public string Genre { get; set; } }}
1.4添加控制器
在Controllers文件夹下,(删除ValuesController.cs)添加ProductsController.cs,其代码:
using System.Collections.Generic;using System.Web.Http;using WebApi04.Models;using System.Linq;namespace WebApi04.Controllers{ public class ProductsController : ApiController { //模拟数据 static List<Product> products = InitList(); private static List<Product> InitList() { var list = new List<Product> { new Product{ID=1,Name="联想500", Genre="电脑"}, new Product{ID=2,Name="苹果5s", Genre="手机"}, new Product{ID=3,Name="HP500", Genre="电脑"}, new Product{ID=4,Name="三星Note4", Genre="手机"}, new Product{ID=5,Name="IBM X86", Genre="电脑"}, new Product{ID=6,Name="屌丝", Genre="逼格"} }; return list; } // GET: api/Products /// <summary> /// 查询所有 /// </summary> /// <returns>产品集合</returns> public IEnumerable<Product> GetProducts() { return products; } /// <summary> /// 根据id查询 /// </summary> /// <param name="id">产品id</param> /// <returns>单个产品</returns> public Product Get(int id) { var product = (from p in products where p.ID == id select p).FirstOrDefault(); return product; } }}
1.5查询所有
运行网站后,打开fiddler工具:
查看结果:
1.6查询单个
1.7查询单个不存在
查询id=100,这个模拟数据中没有。
它返回的结果是null或提示非法的,可它的状态码Result,还是200(如果前面操作字符集合例子,程序会提示索引范围出错,状态码也不是200),显然不合理了。
最好不存在的,状态码为404。
修改ProductsController.cs中Get(int id),其代码:
//如果查询单个实体不存在,返回404状态码 /// <summary> /// 根据id查询 /// </summary> /// <param name="id">产品id</param> /// <returns>响应消息</returns> public HttpResponseMessage Get(int id) { var product = (from p in products where p.ID == id select p).FirstOrDefault(); if (product != null) { return Request.CreateResponse<Product>(HttpStatusCode.OK, product); } else { return Request.CreateErrorResponse(HttpStatusCode.NotFound, "不存在"); } }
需要添加下列命名空间:using System.Net.Http;using System.Net;
再一次测试查询:
修改ProductsController.cs中Get(int id),还可以使用以下方式(结果就不截图了):
// 如果查询单个实体不存在,返回404状态码 [ResponseType(typeof(Product))] public IHttpActionResult Get(int id) { var product = (from p in products where p.ID == id select p).FirstOrDefault(); if (product == null) { return NotFound(); } return Ok(product); }
需要引入using System.Web.Http.Description;
1.8添加一个
在ProductsController.cs中,添加以下代码:
// POST api/values /// <summary> /// 添加产品 /// </summary> /// <param name="product">产品实体</param> /// <returns>响应消息</returns> public HttpResponseMessage Post([FromBody]Product product) { products.Add(product); var msg = Request.CreateResponse(HttpStatusCode.Created); msg.Headers.Location = new System.Uri(Request.RequestUri + (products.Count).ToString()); return msg; }
运行测试:
其结果:
1.9修改视图
前面我们是使用fiddler工具来查看的,可数据如何在网页上显示?
Home\Index.cshtml代码修改:
<ul id="prod"></ul>@section scripts{ <script> $.ajax({ url: ‘/api/products‘, success: function (data) { var producList = $(‘#prod‘); for (var i = 0; i < data.length; i++) { var product = data[i]; producList.append(‘<li>‘ + product.Name + ‘</li>‘); } } }) </script>}
浏览首页:
1.10添加默认页
上面使用了Razorle ,我们也可以直接使用静态html页,在根目录下添加Defaut.html,其代码:
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title>产品</title></head><body> <div> <h2>所有产品</h2> <ul id="products" /> </div> <div> <h2>根据id查询</h2> <input type="text" id="prodId" /> <input type="button" value="http://www.mamicode.com/Search" onclick="find();" /> <p id="product" /> </div> <script src="http://www.mamicode.com/Scripts/jquery-1.10.2.js"></script> <script> var uri = ‘api/products‘; $(document).ready(function () { $.getJSON(uri) .done(function (data) { $.each(data, function (key, item) { $(‘<li>‘, { text: formatItem(item) }).appendTo($(‘#products‘)); }); }); }); function formatItem(item) { return item.Name } //查询 function find() { var id = $(‘#prodId‘).val(); $.getJSON(uri + ‘/‘ + id) .done(function (data) { $(‘#product‘).text(formatItem(data)); }) .fail(function (jqXHR, textStatus, err) { $(‘#product‘).text(‘Error: ‘ + err); }); } </script></body></html>
浏览此页:
(注:用jquey 请求和绑定数据,代码量比较高了。后面教程会使用Knockout.js来举例)
2.小结
本例你又能学到什么?希望你有兴趣继续看下去。当然,没有写删除和修改方法了,你可以体会仿前面的例子写就是了。
WebApi学习笔记04:使用webapi模板--实体类--状态码--视图