zoukankan      html  css  js  c++  java
  • Asp.netCore RESTful WebApi 小结

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

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

      一、WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术,它的特点有:

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

        2、web Service 最大的优势便是跨平台的可互操作性;

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

        4、一些只需要与本机上的其余程序通讯的应用程序则不适合用web Service,理由并非技术上无法实现,而是消耗过大没有任何好处。

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

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

        2、可以支持各种各样的协议,比如TCP,HTTP,HTTPS,Json等;

        3、与其前辈web Service相比,WCF不仅可以部署在IIS上还可以部署在应用程序中或者Windows服务中;

        4、只要支持标准的web service,可以跨进程、跨机器甚至于跨平台的通信。

      三、WebApi的特点:

        1、需要通过URI信息来指定端点,每一个URI代表1种资源;

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

        3、通过请求来实现对资源的资源,资源的表现形式大多是XML或者HTML(亦或其它),请求的回复通过Http Status Code表达不同含义,并且客户端可以通过Accept header来与服务器协商格式,例如希望服务器返回JSON格式还是XML格式亦或者其他扩展格式;

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

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

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

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

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

        3、当你想创建一个基于HTTP的面向资源的服务并且可以使用HTTP的全部特征时(比如URIs、request/response头,缓存,版本控制,多种内容格式),你应该选择WebAPI

        4、当你想让你的服务用于浏览器、手机、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

  • 相关阅读:
    PP篇10 修改工单组件行
    取未清PO逻辑
    PP篇7 生产替代料齐套后处理
    PP篇9 更改计划订单
    DEBUG技巧里的问题1 双击某个变量不能显示
    HoloLens开发手记
    开始开发HoloLens应用吧 Start Developing HoloLens Apps Today
    HoloLens开发手记
    HoloLens开发手记
    HoloLens开发手记
  • 原文地址:https://www.cnblogs.com/laziji666/p/13091188.html
Copyright © 2011-2022 走看看