1、什么是WebApi,它有什么用途?

Web API是一个比较宽泛的概念。这里我们提到Web API特指ASP.NET MVC Web API。在新出的MVC中,增加了WebAPI,用于提供REST风格的WebService,新生成的WebAPI项目和典型的MVC项目一样,包含主要的Models、Views、Controllers等文件夹和Global.asax文件。Views对于WebAPI来说没有太大的用途,Models中的Model主要用于保存Service和Client交互的对象,这些对象默认情况下会被转换为Json格式的数据迚行传输,Controllers中的Controller对应于WebService来说是一个Resource,用于提供服务。和普通的MVC一样,Global.asax用于配置路由规则,个人的理解MVC控制器中一般方法返回的是一个视图而Api返回的是数据,可以是List、Json等格式。对于WebAPI来说它最初被设计为和WCF一样的客户端口、服务端口两套结构我们到现在还没有提到客户端口是因为我们的请求别的方式来封装成HTTP请求接收收HTTP相应的比如AJAX和Form表单提交。接下来我们用VS2017新建一个webApi项目。

2、打开VS2017 点文件-----> 新建---->项目。快捷键(Ctrl+Shift+N)

Web里面的Asp.Net Web 应用程序

上面一定要选Web API 。项目建好了 我先做一个从数据库取出数据在调用的栗子。

3、在控制器文件夹右键---->添加---->控制器。选择Web API2 Controller Empty点确定取名Customer  因为后面要操作数据库这张表 ,点add完成

这时候App_Satrt文件夹下面多了一个文件WebApiConfig.cs,这个文件是它的路由

由于以前都是用原生的sql访问数据库  所以现在也说一下 原生的sql 在asp.net MVC中的使用不用EF连接 后面也使用EF

4、在Models文件夹下面建立模型类Customer类与SqlDB类,这里没有分三层架构就简单的写在一起了理解就行(SqlDB类这里有《Asp.Net中对操作Sql Server 简单处理的SqlDB类》)

  1. public class Customer
  2. {
  3. //ID
  4. public int ID { get; set; }
  5. //姓名
  6. public string Name { get; set; }
  7. //学号
  8. public string Number { get; set; }
  9. //性别1男2女
  10. public int Sex { get; set; }
  11. //院系
  12. public string Department { get; set; }
  13. //专业
  14. public string Manjor { get; set; }
  15. //年级
  16. public int Class { get; set; }
  17. //联系方式
  18. public string Mobile { get; set; }
  19.  
  20. }

在项目的web.config配置文件里面一定要加数据库连接字符串配置

  1. <connectionStrings>
  2. <!--连接字符串-->
  3. <add name="SqlConn" connectionString=" Data Source=.;Initial Catalog=OneCardSystem;Integrated Security=True" />
  4. </connectionStrings>

5、在API控制器里面写个方法返回List类型的数据

这个API控制器一定是继承ApiController这个控制器的

  1. public class CustomerController : ApiController
  2. {
  3. Customer customer = new Customer();
  4. public List<Customer> GetCustomerAll()
  5. {
  6. //sql语句
  7. string _sql = "Select * from Customer";
  8. //实例SqlDB类
  9. SqlDB sb = new SqlDB();
  10. //定义List储存
  11. List<Customer> list = new List<Customer>();
  12. //获取数据
  13. var data = sb.ExecuteDataSet(_sql).Tables[].Rows;
  14. //遍历data
  15. foreach(DataRow item in data)
  16. {
  17. var customer = new Customer()
  18. {
  19. //对应字段
  20. ID = Convert.ToInt32(item["ID"].ToString()),
  21. Number= item["Number"].ToString(),
  22. Name= item["Name"].ToString(),
  23. Manjor= item["Manjor"].ToString(),
  24. Mobile= item["Mobile"].ToString()
  25. };
  26. //逐条添加到list里面
  27. list.Add(customer);
  28. }
  29. //返回list
  30. return list;
  31. }
  32. }

6、运行项目默认来到Home控制器所对应的视图在地址栏后面加上/api/Customer/GetCustomerAll  就可以看到数据了   这个是在谷歌浏览器上面看到的结果,不同的浏览器有不同的效果 有时间自己试试看,API控制器访问主要的就是在端口后面加上/api/控制器/方法名, 后面有参数的接上参数跟mvc一般的控制器我的理解就是就多了api的前缀

7、现在在浏览器里面可以直接调用这个api了 ,接下来在一个项目中Home所对应的Index视图里面我们用前台技术(jQuery  getJSON)访问调用一下试试

把引用的布局我倒是删除了,Views文件夹下面的_ViewStart.cshtml 删除了   Index.cshtml里面的的内容也删了

代码在下面  别忘了引用JS

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>ASP.NET Web API</title>
  5. <script type="text/javascript" src="~/Scripts/jquery-3.3.1.js"></script>
  6. <script type="text/javascript">
  7. $(document).ready(function () {
  8. $.getJSON("/api/Customer/GetCustomerAll", function (data) {
  9. // console.log(data);
  10. $.each(data, function (key, val) {
  11. $("#batMain").append("<tr><td>" + data[key].ID + "</td><td>" + data[key].Name + "</td><td>" + data[key].Number + "</td><td>" + data[key].Manjor + "</td><td><a class='tabEdit'>编辑</a>&nbsp;&nbsp;&nbsp;<a class='tabDele'>删除</a></td></tr>");
  12. Op();
  13. });
  14. });
  15. $("#btnSave").click(function () {
  16. var id = $("#txtID").val();
  17. var Name = $("#txtName").val();
  18. var Number = $("#txtNumber").val();
  19. var Manjor = $("#txtManjor").val();
  20. var customer = {
  21. ID:id,
  22. Name:Name,
  23. Number:Number,
  24. Manjor:Manjor
  25. }
  26. $.ajax({
  27. type: "post",
  28. url: "/api/Customer/Edit",
  29. // data: { "id": id, "Name": Name, "Number": Number, "Manjor": Manjor },
  30. data: JSON.stringify(customer),
  31. contentType:"application/json",
  32. success: function (data) {
  33. console.log(data);
  34. },
  35. error: function () {
  36. }
  37. });
  38. });
  39. });
  40. function Op() {
  41. var id = "";
  42. var row
  43. var tab = document.getElementById("batMain");
  44. var edit = $(".tabEdit");
  45. var dele = $(".tabDele");
  46. for (var i = 0; i < edit.length; i++) {
  47. edit[i].onclick = function () {
  48. row = this.parentNode.parentNode.rowIndex;
  49. id = $("#batMain tr:eq(" + row + ") td:eq(0)").html();
  50. $("#txtID").val($("#batMain tr:eq(" + row + ") td:eq(0)").html());
  51. $("#txtName").val($("#batMain tr:eq(" + row + ") td:eq(1)").html());
  52. $("#txtNumber").val($("#batMain tr:eq(" + row + ") td:eq(2)").html());
  53. $("#txtManjor").val($("#batMain tr:eq(" + row + ") td:eq(3)").html());
  54. }
  55. }
  56. }
  57. </script>
  58. <style type="text/css">
  59. table{width:100%;}
  60. table tr td{text-align:center; line-height:20px; height:25px; min-width:80px; border:1px solid #d0cfcf;word-wrap:break-word;word-break:break-all;}
  61. a{list-style:none;font-size:12px;font-weight:600; color:#072af7;}
  62. a:hover{cursor:pointer}
  63. .trOne{background:rgb(202, 200, 212); line-height:40px; font-size:14px; font-weight:600;}
  64. </style>
  65. </head>
  66. <body id="body">
  67. <div style="width:90%; margin: 0 auto;">
  68. <h1>学生信息</h1>
  69. <table cellpadding="0" cellspacing="0">
  70. <tr>
  71. <td width="20%"><input type="text" id="txtID" readonly="readonly" /></td>
  72. <td width="20%"><input type="text" id="txtName" /></td>
  73. <td width="20%"><input type="text" id="txtNumber" /></td>
  74. <td width="20%"><input type="text" id="txtManjor" /></td>
  75. <td width="20%"><input type="button" id="btnSave" value="确定" /></td>
  76. </tr>
  77. </table>
  78. <table cellpadding="0" cellspacing="0" id="batMain">
  79. <tr class="trOne">
  80. <td width="20%">ID</td>
  81. <td width="20%">姓名</td>
  82. <td width="20%">学号</td>
  83. <td width="20%">专业</td>
  84. <td width="20%">操作</td>
  85. </tr>
  86. </table>
  87. </div>
  88. </body>
  89. </html>

看看效果

这里的编辑删除操作我还没有做完,不过一般的asp.net mvc我里面用的是ajax请求后台  这个不是请求API只是处理一般的增删查改,这里记录一下传值的问题

dada里面可以是// data: { "id": id, "Name": Name, "Number": Number, "Manjor": Manjor },这样的格式 后台获取直接用Request["ID"]  这样子就可以获取了。也可以在方法里面定义对应的参数 ,参数名要跟data里面的一样

也可以传值成一个对象过去 data: JSON.stringify(customer), 这样   后台接收 var stream = HttpContext.Request.InputStream;     string JsonStr = new StreamReader(stream).ReadToEnd(); 然后自己解析一下

如果要在请求的API里面传参数我只能传一个ID 其他的还没有研究 要传对象过去的话还要在方法里面加上 ([FromBody] Customer ct)这样

8、在后台通过HttpClient调用API 我做练习的时候是用两个项目 一个运行着 另一个调用这个  现在我弄在一个项目里面   用控制器来请求。新建一个控制器Show右键Index添加视图Index.cshyml

  1. public class ShowController : Controller
  2. {
  3. // GET: Show
  4. public ActionResult Index()
  5. {
  6. //获取端口
  7. string url= Request.Url.ToString();
  8. var httpClient = new HttpClient();
  9. var data= httpClient.GetAsync(url+ "api/Customer/GetCustomerAll").Result.Content.ReadAsStringAsync().Result;//调用API
  10. System.Web.Script.Serialization. JavaScriptSerializer Serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
  11. List<Customer> objs = Serializer.Deserialize<List<Customer>>(data);//Json反序列化成List
  12.  
  13. // Customer cs = JsonConvert.DeserializeObject<Customer>(cg.ReturnData);
  14. //, JsonRequestBehavior.AllowGet
  15. return View(objs);
  16. }
  17. }

视图

对应的代码

  1. @{
  2. ViewBag.Title = "Index";
  3. }
  4. @using WebApiTest.Models;
  5. @model List<Customer>
  6.  
  7. <html lang="en">
  8. <head>
  9. <title>调用API</title>
  10. <style type="text/css">
  11. table{width:100%;}
  12. table tr td{text-align:center; line-height:20px; height:25px; min-width:80px; border:1px solid #d0cfcf;word-wrap:break-word;word-break:break-all;}
  13. a{list-style:none;font-size:12px;font-weight:600; color:#072af7;}
  14. a:hover{cursor:pointer}
  15. .trOne{background:rgb(202, 200, 212); line-height:40px; font-size:14px; font-weight:600;}
  16. </style>
  17. </head>
  18. <body id="body">
  19. <br />
  20. <div style="width:90%; margin: 0 auto;">
  21.  
  22. <table>
  23. <tr class="trOne">
  24. <td width="20%">ID</td>
  25. <td width="20%">姓名</td>
  26. <td width="30%">学号</td>
  27. <td width="30%">专业</td>
  28. </tr>
  29. @{
  30. if(Model.Count>0)
  31. {
  32. foreach(var item in Model)
  33. {
  34. <tr>
  35. <td>@item.ID</td>
  36. <td>@item.Name</td>
  37. <td>@item.Number</td>
  38. <td>@item.Manjor</td>
  39. </tr>
  40. }
  41. }
  42. }
  43. </table>
  44. </div>
  45. </body>
  46. </html>

注意应用using System.Web.Script.Serialization; 没有的话来这里找

修改路由配置指向Show 控制器运行项目 你会看到

 9、遇到的问题:

如果这里你要返回一个Json数据 记得添加 return(objs, JsonRequestBehavior.AllowGet) 写成这样 具体什么错我也忘记了 JsonResult也是一样的new 的时候一样的添加后面的

如果在不同的项目中调用还要在配置文件里面加下面的代码 加在<system.webServer>里面  实在写API的项目的配置文件里面

  1. <!--跨域配置-->
  2. <httpProtocol>
  3. <customHeaders>
  4. <add name="Access-Control-Allow-Origin" value="*" />
  5. <add name="Access-Control-Max-Age" value="" />
  6. <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
  7. <add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
  8. </customHeaders>
  9. <tpProtocol>
  10. <handlers>
  11. <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  12. <remove name="OPTIONSVerbHandler" />
  13. <remove name="TRACEVerbHandler" />
  14. <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  15. </handlers>

要是调试的时候出错发现请求的路径会自动的加上一个Home 在api前面记得在api里面类名前面加 [RoutePrefix("Api/Customer")]

10、总结:本来的需求是要调用人家的API数据库记录调用的地址、时间、返回的数据这些,就先弄弄,EF、Linq拉姆达这些后面有时间在弄吧 我弄了一点不是很理解在这里还是个小白,以前都是用原生的Sql语句写的现在都不用了,只能慢慢学了。欢迎有缘看到的朋友指出不足,共同学习!好久没有写博客了,月到十五光明少,人到中年万事休。

Asp.Net MVC WebAPI的创建与前台Jquery ajax后台HttpClient调用详解的更多相关文章

  1. ASP.NET MVC & WebApi 中实现Cors来让Ajax可以跨域访问 (转载)

    什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpReq ...

  2. 案例:1 Ionic Framework+AngularJS+ASP.NET MVC WebApi Jsonp 移动开发

    落叶的庭院扫的一干二净之后,还要轻轻把树摇一下,抖落几片叶子,这才是Wabi Sabi的境界. 介绍:Ionic是移动框架,angularjs这就不用说了,ASP.Net MVC WebApi提供数据 ...

  3. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

  4. 【初学者指南】在ASP.NET MVC 5中创建GridView

    介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样.服务器端和客户端有许多可用的第三方库,这些 ...

  5. 让Asp.net mvc WebAPI 支持OData协议进行分页查询操作

    这是我在用Asp.net mvc WebAPI 支持 OData协议 做分页查询服务时的 个人拙笔. 代码已经开发到oschina上.有兴趣的朋友可以看看,欢迎大家指出不足之处. 看过了园子里的几篇关 ...

  6. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序创建更复杂的数据模型

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序 ...

  7. Contoso 大学 - 1 - 为 ASP.NET MVC 应用程序创建 EF 数据模型

    原文 Contoso 大学 - 1 - 为 ASP.NET MVC 应用程序创建 EF 数据模型 原文地址:Creating an Entity Framework Data Model for an ...

  8. 为ASP.NET MVC应用程序创建更复杂的数据模型

    为ASP.NET MVC应用程序创建更复杂的数据模型 2014-05-07 18:27 by Bce, 282 阅读, 1 评论, 收藏, 编辑 这是微软官方教程Getting Started wit ...

  9. .net异步性能测试(包括ASP.NET MVC WebAPI异步方法)

    很久没有写博客了,今年做的产品公司这两天刚刚开了发布会,稍微清闲下来,想想我们做的产品还有没有性能优化空间,于是想到了.Net的异步可以优化性能,但到底能够提升多大的比例呢?恰好有一个朋友正在做各种语 ...

随机推荐

  1. layui 表格内容显示更改

    在cole 中使用temple 属性进行修改 例: table.render({ elem: '#messageTable' ,id: 'search_table_mId' ,height: 500 ...

  2. [tkinter]为列表框添加滚动条

    为了给列表框配备滚动条,看来很多别人的博客 终于解决了问题 ,现在我总结一下 from tkinter import * root = Tk() lb = Listbox(root) scr = Sc ...

  3. 小程序textarea完美填坑

    相信做微信小程序的码友们都被textarea这个原生组件坑过,什么placeholder位置错乱,穿透弹窗或遮罩层,ios上输入法弹起后换行输入内容遮挡,删除输入内容时内容被遮挡等等... 反正综上所 ...

  4. Lesson 26 The best art critics

    Text I am an art student and I paint a lot of pictures. Manay people pretend that they understand mo ...

  5. Java实现单例模式的9种方法

    一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...

  6. Servlet, Struts2和SpringMVC 并发访问线程安全问题

    第一部分: Servlet不是线程安全的. 要解释Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的. 当Tomcat接收到Client的HTTP ...

  7. [Swift]LeetCode145. 二叉树的后序遍历 | Binary Tree Postorder Traversal

    Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [1,null,2, ...

  8. [Swift]LeetCode911. 在线选举 | Online Election

    In an election, the i-th vote was cast for persons[i] at time times[i]. Now, we would like to implem ...

  9. app自动化问题点整理

    1.配置SDK环境发现adb无法生效: 解决方案: 这个问题一般就是你的环境变量没有配置好,很多同学比较容易出现的点就是win10系统的环境变量配置: 一定要注意打开path添加:%ANDROID_H ...

  10. Spotlight监控Oracle--Spotlight On Oracle安装和使用

    网上找了很久,发现单独Spotlight On Oracle的安装包很少,要么要积分C币的,要么官网要授权的. 应用过程中也没有一个集安装与运用与一体的文档,故汇总相关信息,供参考. Spotligh ...