Asp.netCore RESTful WebApi 小结

上篇文章记录了WebApi的概念以及简单的认知WebApi ,今天来探究下它的适用场景以及怎么去用它。html

  先简单聊一下WebApi与用得比较多的WCF、WebService各自的特色:前端

  1、WebService是一种能够接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通信技术,它的特色有:java

    一、基于SOAP协议的,数据格式是XML;web

    二、web Service 最大的优点即是跨平台的可互操做性;ajax

    三、支持Http协议Xml技术的设备便可拥有而且访问web Service,但只能部署在IIS上 ;json

    四、一些只须要与本机上的其他程序通信的应用程序则不适合用web Service,理由并不是技术上没法实现,而是消耗过大没有任何好处。后端

  2、WCF是提供统一的,可用于创建安全、可靠的面向服务的应用的高效开发平台,其特色有:api

    一、基于SOAP协议的,数据格式是XML;跨域

    二、能够支持各类各样的协议,好比TCP,HTTP,HTTPS,Json等;数组

    三、与其前辈web Service相比,WCF不只能够部署在IIS上还能够部署在应用程序中或者Windows服务中;

    四、只要支持标准的web service,能够跨进程、跨机器甚至于跨平台的通讯。

  3、WebApi的特色:

    一、须要经过URI信息来指定端点,每个URI表明1种资源;

    二、可经过不一样的http动做表达不一样的含义,客户端使用GET、POST、PUT、DELETE4个表示操做方式的动词对服务端资源进行操做:GET用来获取资源,POST用来新建资源(也能够用于更新资源),PUT用来更新资源,DELETE用来删除资源;

    三、经过请求来实现对资源的资源,资源的表现形式大可能是XML或者HTML(亦或其它),请求的回复经过Http Status Code表达不一样含义,而且客户端能够经过Accept header来与服务器协商格式,例如但愿服务器返回JSON格式仍是XML格式亦或者其余扩展格式;

    四、支持跨平台、CORS跨域调用WebApi,如经过前端js或者直接在后台调用它,部署时支持Self-host或者IIS。;

    五、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每一个请求都必须包含理解请求所必需的信息。

  聊完它们的特色,那么如何物尽其用呢?(参考连接:https://blog.csdn.net/u013043518/java/article/details/51793294)

    一、当你想建立一个支持消息、消息队列、双工通讯的服务时,你应该选择WCF

    二、当你想建立一个服务,能够用更快速的传输通道时,像TCP、NamedPipes或者甚至是UDP(在WCF4.5中),在其余传输通道不可用的时候也能够支持HTTP。

    三、当你想建立一个基于HTTP的面向资源的服务而且可使用HTTP的所有特征时(好比URIs、request/response头,缓存,版本控制,多种内容格式),你应该选择WebAPI

    四、当你想让你的服务用于浏览器、手机、iPhone和平板电脑时,你应该选择Web API

   前面在聊WebApi特色的时候有提到能够经过前端或者在后台去调用它,看下具体如何调用:

    例1: 经过HttpClient类调Api。在Web API发布的同时,.NET提供了两个程序集:System.Net.Http和System.Net.Http.Formatting。这两个程序集中最核心的类是HttpClient (在这里只讨论如何调WebApi,思路为打磨一个通用的工具类,其他部分各位看官自由发挥):

 1 public class CallAPI
 2 {
 3 private static string uri = "http://localhost:5000/";
 4 private HttpClient client = new HttpClient();
 5 
 6 /// <summary>
 7 /// 简单查询
 8 /// </summary>
 9 /// <param name="resource">目标资源</param>
10 public void GetData(string resource)
11 {
12   client.BaseAddress = new Uri(uri);
13 
14   // 为JSON格式添加一个Accept报头
15   client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
16   HttpResponseMessage responseMessage = client.GetAsync(resource).Result;//获取查询结果
17   if (responseMessage.IsSuccessStatusCode)
18   {
19     var ds = responseMessage.Content.ReadAsStringAsync().Result;
20     string content = JsonConvert.SerializeObject(ds, Newtonsoft.Json.Formatting.Indented);//转换为你想要的格式如xml,json等,定义通用的转换类这里就不介绍了,请自行打造
21   }
22 }
23 
24 /// <summary>
25 /// 带参查询
26 /// </summary>
27 /// <param name="resource">目标资源</param>
28 /// <param name="id">ID</param>
29 public void GetDataWithParam(string resource)
30 {
31   client.BaseAddress = new Uri(uri);
32 
33   client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
34   HttpResponseMessage responseMessage = client.GetAsync(resource).Result;
35   if (responseMessage.IsSuccessStatusCode)
36   {
37     var ds = responseMessage.Content.ReadAsStringAsync().Result;
38     string content = JsonConvert.SerializeObject(ds, Newtonsoft.Json.Formatting.Indented);
39   }
40 
41 }
42 
43 
44 /// <summary>
45 /// put请求更新资源
46 /// </summary>
47 /// <param name="resource"></param>
48 /// <returns></returns>
49 public bool PutData(string resource)
50 {
51   bool bol = false;
52   //建立和webapi对应的类
53   var content = new FormUrlEncodedContent(new Dictionary<string, string>()
54   {
55     {"ID","382accff-57b2-4d6e-ae84-a61e00a3e3b5"},
56     {"Name","Name" },
57     {"QZH","111"}
58   });
59   HttpResponseMessage response = client.GetAsync(resource).Result;
60   response = client.PostAsync(resource, content).Result;
61   if (response.IsSuccessStatusCode)
62   {
63     bol = true;
64     var result = response.Content.ReadAsStringAsync().Result;
65   }
66   return bol;
67 }
68 
69 }
View Code

      例2:基于mvc+dotnet core WebApi,经过前端ajax来调用,下面直接贴几段不一样调用类型的代码(因为Put 请求与Post请求相似就再也不举例贴代码):

    片断1:基础类型做为参数

 1  前端ajax代码:
 2 $.ajax({
 3 type: "get",
 4 url: "http://localhost:27221/api/Charging/GetAllChargingData",
 5 data: { id: 1, name: "Jim", bir: "1988-09-11"},
 6 success: function (data, status) {
 7 if (status == "success") {
 8 $("#div_test").html(data);
 9 }
10 }
11 });
12 Controller层代码:
13 [HttpGet]
14 public string GetAllChargingData(interestingid,string name, DateTime bir)
15 {return "ChargingData" + id;}
View Code

    片断2:实体类型做为参数

 1 前端ajax代码: 
 2  $.ajax({
 3 type: "get",
 4 url: "http://localhost:27221/api/Charging/GetByModel",
 5 contentType: "application/json",
 6 data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },
 7 success: function (data, status) {
 8 if (status == "success") {
 9 $("#div_test").html(data);
10 }
11 }
12 });
13 Controller层代码一(先序列化,再在后台反序列的方式):
14 [HttpGet]
15 public string GetByModel(string strQuery)
16 {
17 TB_CHARGING oData=Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery));
18 return "Charging" + oData.ID;
19 }
20 Controller层代码二(在参数里面加上[FromUri]):
21 [HttpGet]
22 [HttpGet]
23 public string GetAllChargingData([FromUri]TB_CHARGING obj)
24 {
25 return "ChargingData" + obj.ID;
26 }
View Code

    片断3:单个实体做为参数:(post请求默认是将表单里面的数据的key/value形式发送到服务,而咱们的服务器只须要有对应的key/value属性值的对象就能够接收到。而若是使用application/json,则表示将前端的数据以序列化过的json传递到后端,后端要把它变成实体对象,还须要反序列化的过程)

 1 方法一: (使用post请求的默认参数类型,前端直接传递json类型的对象)
 2 前端ajax代码:
 3 $.ajax({
 4 type: "post",
 5 url: "http://localhost:27221/api/Charging/SaveData",
 6 data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
 7 success: function (data, status) {}
 8 });
 9 方法二:(指定了contentType为application/json,需序列化待传递的对象)
10 前端ajax代码:
11 var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
12 $.ajax({
13 type: "post",
14 url: "http://localhost:27221/api/Charging/SaveData",
15 contentType: 'application/json',
16 data: JSON.stringify(postdata),
17 success: function (data, status) {}
18 });
19 Controller层代码:
20 [HttpPost]
21 public bool SaveData(TB_CHARGING oData)
22 {
23 return true;
24 }
View Code

    片断4:实体和基础类型一块儿做为参数传递

 1 前端ajax代码:
 2 var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
 3 $.ajax({
 4 type: "post",
 5 url: "http://localhost:27221/api/Charging/SaveData",
 6 contentType: 'application/json',
 7 data: JSON.stringify({ NAME:"Lilei", Charging:postdata }),
 8 success: function (data, status) {}
 9 });
10 Controller层代码:
11 [HttpPost]
12 public object SaveData(dynamic obj)
13 {
14 var strName = Convert.ToString(obj.NAME);
15 var oCharging = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(Convert.ToString(obj.Charging));
16 return strName;
17 }
View Code

    片断5:基础类型数组做为参数传递

 1 前端ajax代码:
 2     var arr = ["1", "2", "3", "4"];
 3     $.ajax({
 4         type: "post",
 5         url: "http://localhost:27221/api/Charging/SaveData",
 6         contentType: 'application/json',
 7         data: JSON.stringify(arr),
 8         success: function (data, status) { }
 9     });
10 Controller层代码:
11         [HttpPost]
12         public bool SaveData(string[] ids)
13         {
14             return true;
15         }
View Code

    片断6:简单贴个Delete请求

 1     var arr = [
 2         { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
 3         { ID: "2", NAME: "Lilei", CREATETIME: "1990-12-11" },
 4         { ID: "3", NAME: "Lucy", CREATETIME: "1986-01-10" }
 5     ];
 6     $.ajax({
 7         type: "delete",
 8         url: "http://localhost:27221/api/Charging/OptDelete",
 9         contentType: 'application/json',
10         data: JSON.stringify(arr),
11         success: function (data, status) {}
12     });
13 Controller层:
14         [HttpDelete]
15         public bool OptDelete(List<TB_CHARGING> lstChargin)
16         {
17             return true;
18         }
View Code

  总结:记录下我的的学习Asp.netCore RESTful WebApi的过程,不对之处欢迎指正。另:对于Controller层WebApi返回值的梳理建议参考官网文档(https://docs.microsoft.com/zh-cn/aspnet/core/web-api/action-return-types?view=aspnetcore-3.1

相关文章
相关标签/搜索