1.WebApi是什么

ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务。ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。

可以把WebApi看成Asp.Net项目类型中的一种,其他项目类型诸如我们熟知的WebForm项目,Windows窗体项目,控制台应用程序等。

WebApi类型项目的最大优势就是,开发者再也不用担心客户端和服务器之间传输的数据的序列化和反序列化问题,因为WebApi是强类型的,可以自动进行序列化和反序列化,一会儿项目中会见到。

下面我们建立了一个WebApi类型的项目,项目中对产品Product进行增删改查,Product的数据存放在List<>列表(即内存)中。

2.页面运行效果

如图所示,可以添加一条记录; 输入记录的Id,查询出该记录的其它信息; 修改该Id的记录; 删除该Id的记录。

3.二话不说,开始建项目

1)新建一个“ASP.NET MVC 4 Web 应用程序”项目,命名为“ProductStore”,点击确定

2)选择模板“Web API”,点击确定

3)和MVC类型的项目相似,构建程序的过程是先建立数据模型(Model)用于存取数据, 再建立控制器层(Controller)用于处理发来的Http请求,最后构造显示层(View)用于接收用户的输入和用户进行直接交互。

3)和MVC类型的项目相似,构建程序的过程是先建立数据模型(Model)用于存取数据, 再建立控制器层(Controller)用于处理发来的Http请求,最后构造显示层(View)用于接收用户的输入和用户进行直接交互。

这里我们先在Models文件夹中建立产品Product类: Product.cs,如下:

namespace ProductStore.Models
{public class Product{public int Id { get; set; }public string Name { get; set; }public string Category { get; set; }public decimal Price { get; set; }}
}

4)试想,我们目前只有一个Product类型的对象,我们要编写一个类对其实现增删改查,以后我们可能会增加其他的类型的对象,再需要编写一个对新类型的对象进行增删改查的类,为了便于拓展和调用,我们在Product之上构造一个接口,使这个接口约定增删改查的方法名称和参数,所以我们在Models文件夹中新建一个接口:  IProductRepository.cs ,如下:

using System.Collections.Generic;namespace ProductStore.Models
{interface IProductRepository{IEnumerable<Product> GetAll();Product Get(int id);Product Add(Product item);void Remove(int id);bool Update(Product item);}
}

5)然后,我们实现这个接口,在Models文件夹中新建一个类,具体针对Product类型的对象进行增删改查存取数据,并在该类的构造方法中,向List<Product>列表中存入几条数据,这个类叫:ProductRepository.cs,如下:

using System;
using System.Collections.Generic;namespace ProductStore.Models
{public class ProductRepository{private List<Product> products = new List<Product>();private int _nextId = 1;public ProductRepository(){Add(new Product { Name = "Tomato soup", Category = "Groceries", Price = 1.39M });Add(new Product { Name = "Yo-yo", Category = "Toys", Price = 3.75M });Add(new Product { Name = "Hammer", Category = "Hardware", Price = 16.99M });}public IEnumerable<Product> GetAll(){return products;}public Product Get(int id){return products.Find(p => p.Id == id);}public Product Add(Product item){if (item == null){throw new ArgumentNullException("item");}item.Id = _nextId++;products.Add(item);return item;}public void Remove(int id){products.RemoveAll(p => p.Id == id);}public bool Update(Product item){if (item == null){throw new ArgumentNullException("item");}int index = products.FindIndex(p => p.Id == item.Id);if (index == -1){return false;}products.RemoveAt(index);products.Add(item);return true;}}
}

此时,Model层就构建好了。

6)下面,我们要构建Controller层,在此之前,先回顾一下Http中几种请求类型,如下

get  类型

用于从服务器端获取数据,且不应该对服务器端有任何操作和影响

post 类型

用于发送数据到服务器端,创建一条新的数据,对服务器端产生影响

put 类型

用于向服务器端更新一条数据,对服务器端产生影响 (也可创建一条新的数据但不推荐这样用)

delete 类型

用于删除一条数据,对服务器端产生影响

这样,四种请求类型刚好可对应于对数据的查询,添加,修改,删除。WebApi也推荐如此使用。在WebApi项目中,我们请求的不再是一个具体页面,而是各个控制器中的方法(控制器也是一种类,默认放在Controllers文件夹中)。下面我们将要建立一个ProductController.cs控制器类,其中的方法都是以“Get Post Put Delete”中的任一一个开头的,这样的开头使得Get类型的请求发送给以Get开头的方法去处理,Post类型的请求交给Post开头的方法去处理,Put和Delete同理。

而以Get开头的方法有好几个也是可以的,此时如何区分到底交给哪个方法执行呢?这就取决于Get开头的方法们的传入参数了,一会儿在代码中可以分辨。

构建Controller层,在Controllers文件夹中建立一个ProductController.cs控制器类,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using ProductStore.Models;
using System.Web.Http;
using System.Net;
using System.Net.Http;namespace ProductStore.Controllers
{public class ProductController : ApiController{static readonly ProductRepository repository = new ProductRepository();//GET:  /api/productspublic IEnumerable<Product> GetAllProducts(){return repository.GetAll();}//GET: /api/products/idpublic Product GetProduct(int id){Product item = repository.Get(id);if (item == null){throw new HttpResponseException(HttpStatusCode.NotFound);}return item;}//GET: /api/products?category=categorypublic IEnumerable<Product> GetProductsByCategory(string category){return repository.GetAll().Where(p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase));}//POST: /api/productspublic HttpResponseMessage PostProduct(Product item){item = repository.Add(item);var response = Request.CreateResponse<Product>(HttpStatusCode.Created, item);string uri = Url.Link("DefaultApi", new { id = item.Id });response.Headers.Location = new Uri(uri);return response;}//PUT: /api/products/idpublic void PutProduct(int id, Product product){product.Id = id;if (!repository.Update(product)){throw new HttpResponseException(HttpStatusCode.NotFound);}}//Delete: /api/products/idpublic void DeleteProduct(int id){Product item = repository.Get(id);if (item == null){throw new HttpResponseException(HttpStatusCode.NotFound);}repository.Remove(id);}}
}

使该类继承于ApiController类,在其中实现处理各种Get,Post,Put,Delete类型Http请求的方法。每一个方法前都有一句注释,标识了该方法的针对的请求的类型(取决于方法的开头),以及要请求到该方法,需要使用的url。

这些url是有规律的,见下:

Action

HTTP method

Relative URI

Get a list of all products

GET

/api/products

Get a product by ID

GET

/api/products/id

Get a product by category

GET

/api/products?category=category

Create a new product

POST

/api/products

Update a product

PUT

/api/products/id

Delete a product

DELETE

/api/products/id

api是必须的,products对应的是ProductsControllers控制器,然后又Http请求的类型和url的后边地址决定。

这里,我们除了第三个“Get a product by category”,其他方法都实现了。

7)最后,我们来构建View视图层,我们更改Views文件夹中的Home文件夹下的Index.cshtml文件,这个文件是项目启动页,如下:

<div id="body"><script src="~/Scripts/jquery-1.10.2.min.js"></script><section><h2>添加记录</h2>Name:<input id="name" type="text" /><br />Category:<input id="category" type="text" />Price:<input id="price" type="text" /><br /><input id="addItem" type="button" value="添加" /></section><section><br /><br /><h2>修改记录</h2>Id:<input id="id2" type="text" /><br />Name:<input id="name2" type="text" /><br />Category:<input id="category2" type="text" />Price:<input id="price2" type="text" /><br /><input id="showItem" type="button" value="查询" /><input id="editItem" type="button" value="修改" /><input id="removeItem" type="button" value="删除" /></section></div>

8)然后我们给页面添加js代码,对应上面的按钮事件,用来发起Http请求,如下:

<script>//用于保存用户输入数据var Product = {create: function () {Id: "";Name: "";Category: "";Price: "";return Product;}}//添加一条记录 请求类型:POST  请求url:  /api/Products//请求到ProductsController.cs中的 public HttpResponseMessage PostProduct(Product item) 方法$("#addItem").click(function () {var newProduct = Product.create();newProduct.Name = $("#name").val();newProduct.Category = $("#category").val();newProduct.Price = $("#price").val();$.ajax({url: "/api/Product",type: "POST",contentType: "application/json; charset=utf-8",data: JSON.stringify(newProduct),success: function () {alert("添加成功!");},error: function (XMLHttpRequest, textStatus, errorThrown) {alert("请求失败,消息:" + textStatus + "  " + errorThrown);}});});//先根据Id查询记录  请求类型:GET  请求url:  /api/Products/Id//请求到ProductsController.cs中的 public Product GetProduct(int id) 方法$("#showItem").click(function () {var inputId = $("#id2").val();$("#name2").val("");$("#category2").val("");$("#price2").val("");$.ajax({url: "/api/Product/" + inputId,type: "GET",contentType: "application/json; charset=urf-8",success: function (data) {$("#name2").val(data.Name);$("#category2").val(data.Category);$("#price2").val(data.Price);},error: function (XMLHttpRequest, textStatus, errorThrown) {alert("请求失败,消息:" + textStatus + "  " + errorThrown);}});});//修改该Id的记录 请求类型:PUT  请求url:  /api/Products/Id//请求到ProductsController.cs中的 public void PutProduct(int id, Product product) 方法$("#editItem").click(function () {var inputId = $("#id2").val();var newProduct = Product.create();newProduct.Name = $("#name2").val();newProduct.Category = $("#category2").val();newProduct.Price = $("#price2").val();$.ajax({url: "/api/Product/" + inputId,type: "PUT",data: JSON.stringify(newProduct),contentType: "application/json; charset=urf-8",success: function () {alert("修改成功! ");},error: function (XMLHttpRequest, textStatus, errorThrown) {alert("请求失败,消息:" + textStatus + "  " + errorThrown);}});});//删除输入Id的记录  请求类型:DELETE  请求url:  /api/Products/Id//请求到ProductsController.cs中的  public void DeleteProduct(int id) 方法$("#removeItem").click(function () {var inputId = $("#id2").val();$.ajax({url: "/api/Product/" + inputId,type: "DELETE",contentType: "application/json; charset=uft-8",success: function (data) {alert("Id为 " + inputId + " 的记录删除成功!");},error: function (XMLHttpRequest, textStatus, errorThrown) {alert("请求失败,消息:" + textStatus + "  " + errorThrown);}});});
</script>

这里,WebApi的一个简单的增删改查项目就完成了,选择执行项目即可测试。注意到,其中用ajax发起请求时,发送到服务器端的数据直接是一个json字符串,当然这个json字符串中每个字段要和Product.cs类中的每个字段同名对应,在服务器端接收数据的时候,我们并没有对接收到的数据进行序列化,而返回数据给客户端的时候也并没有对数据进行反序列化,大大节省了以前开发中不停地进行序列化和反序列化的时间。

转载于:https://www.cnblogs.com/Bobby0322/p/5134248.html

Web API开发实例——对产品Product进行增删改查相关推荐

  1. Java Web 应用实例 servlet实现oracle 基本增删改查

    原文地址为: Java Web 应用实例 servlet实现oracle 基本增删改查 很久没有写博客了,可能是太懒散,不愿意把时间花在这上面,可是我心里还是知道写博客的重要性的 ,所以从今天开始 , ...

  2. 使用Maven开发用户模块的CRUD(增删改查)

    使用Maven开发用户模块的CRUD(增删改查) < 使用Maven开发Web应用Archiva服务器的搭建步骤 > C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据 ...

  3. 基于SpringBoot开发一个Restful服务,实现增删改查功能

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 作者:虚无境 cnblogs.com/xuwujing/p/8260935.html 前言 在去 ...

  4. springboot增删改查案例_大神基于SpringBoot开发一个Restful服务,实现增删改查功能...

    前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...

  5. salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)...

    此篇请参看:https://resources.docs.salesforce.com/202/latest/en-us/sfdc/pdf/salesforce_developer_environme ...

  6. JAVA+SWING超市销售管理系统开发(JAVA实训作业增删改查)

    一个非常简单的超市销售系统,只涉及增删改查. 1. 登录 两种方式登录系统,这里主要分享管理员登录 最简单的方法,指定账号密码 JButton button_login = new JButton(& ...

  7. OpenLayers学习笔记高级篇(四、地图开发实战之地图要素的增删改查)

    一切都准备好了,现在终于可以通过ol3加载配置好的数据了.上一节中最后的预览结果,大家已经看到了,此处我们自己通过ol来实现这个预览页面,直接上代码如下: 1.加载Geoserver发布的wfs地图服 ...

  8. Apache Kafka API AdminClient Scram账户的操作(增删改查)

    前言 很久没有更新Kafka API相关的文档了,因为笔者工作变动Kafka这部分内容在工作中接触的就相对于之前少了一些.但架不住kafka官方还是一如既往的勤奋,官方操作Scram账户的创建与删除这 ...

  9. 【Java Web开发指南】Maven+MyBatis实现增删改查的Demo

    文章目录 1 概述 1.1 Maven 1.2 Mybatis(ORM) 2 Mybatis开发指南 3 DATABASE 4 代码 4.1 目录结构 4.2 详细步骤 5 附录 1 概述 源码: h ...

  10. Vue3电影中后台开发纪实(四):增删改查

    项目源码:电影中台+后台 @删除单个热映数据 准备删除接口 api/movieApi.js /* 删除影片 */ // async函数的返回值是Promise对象 export async funct ...

最新文章

  1. 【机器视觉案例】(8) AI视觉,手势控制电脑鼠标,附python完整代码
  2. 优秀!21岁读博,26岁博士毕业即为副教授,同年又晋升教授和博导!
  3. 计算机二级题31套资料,计算机等级考试:二级VFP机试第31套
  4. linux php7 安装redis扩展(php7可以使用自测)
  5. 改进程架构,Edge优化浏览器内存问题
  6. VirtualCopy()操作I/O口 物理地址为什么要移8位
  7. VGG和GoogLeNet inception
  8. Mr.J-- jQuery学习笔记(十三)--选项Tab卡
  9. [20160224]-bashELF command not found.txt
  10. [转载] 利用python对csv文件进行简单的数据分析
  11. springAOP,面向切面编程详解,通俗易懂
  12. t470键盘拆解_ThinkPad T470拆机图赏:堪称商务本的业界标杆
  13. 基于JavaWeb的C2C网上购物平台系统设计
  14. python的if __name__ == “__main__“语法错误SyntaxError: invalid syntax
  15. 有舍有得,解散20个群后 ...
  16. 【Elasticsearch】 (搜索引擎如何做搜索推荐?) Elasticsearch中 使用 Suggesters 推荐查询
  17. C/C++ 开发利器 CLion安装与配置
  18. SpringBoot2.0整合多数据源拆分
  19. reactnative 京豆
  20. 平安汽车租赁有话说:汽车融资租赁,被误解的那些年...

热门文章

  1. python做性能测试_Python做性能测试-1、Locust基础篇
  2. 企业为什么要做高端网站优化呢?
  3. ASP.NET 性能监控工具和优化技巧
  4. 【Java集合的详细研究4】Java中如何遍历Map对象的4种方法
  5. IOS 中description 和 debugDescription的区别
  6. mysql 存储过程:提供查询语句并返回查询执行影响的行数
  7. 编程算法基础-一刀切法
  8. windows7+fedora16双系统安装
  9. CNN中的卷积、1x1卷积及在pytorch中的验证
  10. jdk unsafe类源码解析