www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

进阶系列

2019-05-04 00:39 来源:未知

  看那边小说时的吸引是:WebApi中的参数加了[FromBody],一无所知然,就百度了下,看到了以下小说,和大家分享下:

C#进阶体系——WebApi 接口参数不再可疑:传参详解,

  看那边小说时的吸引是:WebApi中的参数加了[FromBody],一无所知然,就百度了下,看到了以下小说,和大家分享下:

  最初的作品链接:

 

前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了长时间,查阅了半天资料。近日,使用WebApi也有段时日了,今日就记录下API接口传参的1对艺术艺术,算是八个笔记,也目的在于能帮初专家少走弯路。本篇针对初初使用WebApi的同班们,比较基础,有乐趣的且看看。

WebApi连串小说

  • C#进阶种类——WebApi接口测试工具:WebApiTestClient
  • C#进阶体系——WebApi 跨域难点消除方案:CO牧马人S
  • C#进阶体系——WebApi身份认证消除方案:Basic基础认证
  • C#进阶种类——WebApi接口传参不再狐疑:传参详解
  • C#进阶种类——WebApi接口重回值不疑忌:再次来到值类型详解
  • C#进阶种类——WebApi极度管理消除方案
  • C#进阶种类——WebApi区域Area使用小结

本篇筹算通过get、post、put、delete多样请求方式分别斟酌基础项目(包罗int/string/datetime等)、实体、数组等类型的参数如何传递。

  原版的书文链接:

一、get请求

对于取多少,大家选取最多的应当正是get请求了呢。下边通过多少个示范看看大家的get请求参数字传送递。

 

壹、基础项目参数

[HttpGet]
public string GetAllChargingData(int id, string name)
{
    return "ChargingData"   id;
}

图片 1

$.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetAllChargingData",
        data: { id: 1, name: "Jim", bir: "1988-09-11"},
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 2

参数截图效果

图片 3

 那是get请求最基础的参数字传送递情势,没什么越来越好说的。

序言:还记得刚使用WebApi那会儿,被它的传参机制折腾了永久,查阅了半天资料。近日,使用WebApi也有段时日了,前日就记下下API接口传参的有的主意方法,算是一个笔记,也可望能帮初大家少走弯路。本篇针对初初使用WebApi的同校们,相比基础,有意思味的且看看。

2、实体作为参数

若是大家在get请求时想将实体对象做参数直接传送到后台,是不是管用呢?大家来看望。

图片 4

    public class TB_CHARGING
    {
        /// <summary>
        /// 主键Id
        /// </summary>
        public string ID { get; set; }

        /// <summary>
        /// 充电设备名称
        /// </summary>
        public string NAME { get; set; }

        /// <summary>
        /// 充电设备描述
        /// </summary>
        public string DES { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CREATETIME { get; set; }
    }

图片 5

[HttpGet]
public string GetByModel(TB_CHARGING oData)
{
     return "ChargingData"   oData.ID;
}

图片 6

  $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetByModel",
        contentType: "application/json",
        data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 7

测试结果

图片 8

由上图能够,在get请求时,我们一向将json对象当坚实体传递后台,后台是抽取不到的。那是为何吧?大家来看望对应的http请求

图片 9

本来,get请求的时候,暗许是将参数整体停放了url里面一向以string的情势传递的,后台自然接不到了。

缘由剖析:还记得有面试题问过get和post请求的不相同吗?当中有多个界别正是get请求的数量会附在UEvoqueL之后(正是把数据放置在HTTP协议头中),而post请求则是坐落http协议包的包体中。

听闻园友们的提议,Get请求的时候能够在参数里面增多[FromUri]就能够间接获取目的。依旧贴上代码:

图片 10

    var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
    $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetAllChargingData",
        data: postdata,
        success: function (data, status) { }
    });

图片 11

        [HttpGet]
        public string GetAllChargingData([FromUri]TB_CHARGING obj)
        {
            return "ChargingData"   obj.ID;
        }

赢得结果:

图片 12

借令你不想采用[FromUri]那一个在参数里面加本性的那种“离奇”写法,也足以利用先体系化,再在后台反连串的不二等秘书籍。

图片 13

  $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetByModel",
        contentType: "application/json",
        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 14

        [HttpGet]
        public string GetByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData"   oData.ID;
        }

图片 15

这样在后台得到大家体系化过的目的,再经过反系列化就能够收获目标。

在url里面我们能够看到它自动给目的加了二个编码:

图片 16

有关还有园友们提到 binder那种情势,博主看了下,认为略复杂。有意思味的也足以试试。至于用哪1种艺术传递对象,园友们得以活动选取。

WebApi连串小说

三、数组作为参数

一般get请求不提议将数组作为参数,因为大家清楚get请求传递参数的高低是有限量的,最大十二四字节,数组里面内容较多时,将其看做参数字传送递或者会生出参数超过限度丢失的景况。

  • C#进阶类别——WebApi接口测试工具:WebApiTestClient
  • C#进阶种类——WebApi 跨域难点解决方案:CO帕杰罗S
  • C#进阶种类——WebApi身份申明解决方案:Basic基础认证
  • C#进阶连串——WebApi接口传参不再质疑:传参详解
  • C#进阶种类——WebApi接口重临值不可疑:再次回到值类型详解
  • C#进阶连串——WebApi非凡处理化解方案
  • C#进阶连串——WebApi区域Area使用小结

4、“怪异”的get请求

怎么会说get请求“奇怪”呢?我们先来看望上边包车型大巴三种写法比较。

本篇计划通过get、post、put、delete各类请求方式分别斟酌基础项目(包涵int/string/datetime等)、实体、数组等类型的参数如何传递。

(一)WebApi的办法名称以get先河

图片 17

    $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetByModel",
        contentType: "application/json",
        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 18

        [HttpGet]
        public string GetByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData"   oData.ID;
        }

那是明媒正娶写法,后台加[HttpGet],参数不奇怪得到:

图片 19

为了相比,小编将[HttpGet]去掉,然后再调用

        //[HttpGet]
        public string GetByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData"   oData.ID;
        }

图片 20

相似未有别的难题!有人就想,那是或不是富有的get请求都足以省略掉[HttpGet]那么些标注呢。大家探求便知。

一、get请求

对此取多少,大家利用最多的应该正是get请求了吗。下边通过多少个示范看看我们的get请求参数字传送递。

(二)WebApi的办法名称不以get早先

小编们把在此以前的主意名由GetByModel改成FindByModel,这么些再平常可是了,很五个人查询就不想用Get起先,还有直接用Query开端的。这一个有怎么样关联吗?有未有涉及,大家以真情说话。

图片 21

    $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/FindByModel",
        contentType: "application/json",
        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 22

        [HttpGet]
        public string FindByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData"   oData.ID;
        }

图片 23

相似又可行,未有任何难点呀。分部方的测算,大家去掉[HttpGet]也是卓有功能的,好,我们讲明掉[HttpGet],运转起来试试。

图片 24

结果是不进断点,有个别人不信,我们在浏览器里面看看http请求:

图片 25

呵呵,那就意外了,就改了个情势名,至于那样么?还真至于!

博主的了然是:措施名以Get开端,WebApi会自动暗许这么些请求便是get请求,而1旦您以任何名目初叶而又不标注格局的呼吁形式,那么那年服务器就算找到了这么些法子,不过出于请求方式不明确,所以直接再次来到给你405——方法不被允许的谬误。

末尾结论:持有的WebApi方法最棒是拉长请求的点子([HttpGet]/[HttpPost]/[HttpPut]/[HttpDelete]),不要偷懒,那样既能幸免类似的一无所能,也有利方法的掩护,外人1看就清楚那么些艺术是什么请求。

这相当于为啥许三个人在园子里面问道为啥方法名不加[HttpGet]就调用不到的原委!

一、基础项目参数

[HttpGet]
public string GetAllChargingData(int id, string name)
{
    return "ChargingData"   id;
}

图片 26

$.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetAllChargingData",
        data: { id: 1, name: "Jim", bir: "1988-09-11"},
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 27

参数截图效果

图片 28

 那是get请求最基础的参数字传送递格局,没什么越来越好说的。

二、post请求

在WebApi的RESETful风格里面,API服务的增加和删除改查,分别对应着http的post/delete/put/get请求。大家上边就来讲说post请求参数的传递方式。

二、实体作为参数

比如我们在get请求时想将实体对象做参数直接传送到后台,是还是不是行得通呢?我们来看看。

图片 29

    public class TB_CHARGING
    {
        /// <summary>
        /// 主键Id
        /// </summary>
        public string ID { get; set; }

        /// <summary>
        /// 充电设备名称
        /// </summary>
        public string NAME { get; set; }

        /// <summary>
        /// 充电设备描述
        /// </summary>
        public string DES { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CREATETIME { get; set; }
    }

图片 30

[HttpGet]
public string GetByModel(TB_CHARGING oData)
{
     return "ChargingData"   oData.ID;
}

图片 31

  $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetByModel",
        contentType: "application/json",
        data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 32

测试结果

图片 33

由上海教室能够,在get请求时,大家一向将json对象当加强体传递后台,后台是收到不到的。这是怎么吧?大家来看看对应的http请求

图片 34

原本,get请求的时候,暗中同意是将参数全部放到了url里面一贯以string的样式传递的,后台自然接不到了。

案由剖析:还记得有面试题问过get和post请求的界别吧?个中有三个区分正是get请求的多寡会附在U智跑L之后(便是把多少放置在HTTP协议头中),而post请求则是位于http协议包的包体中。

凭借园友们的建议,Get请求的时候可以在参数里面加多[FromUri]就能够直接获得目的。依然贴上代码:

图片 35

    var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
    $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetAllChargingData",
        data: postdata,
        success: function (data, status) { }
    });

图片 36

        [HttpGet]
        public string GetAllChargingData([FromUri]TB_CHARGING obj)
        {
            return "ChargingData"   obj.ID;
        }

收获结果:

图片 37

万一你不想利用[FromUri]这么些在参数里面加脾性的那种“奇异”写法,也得以运用先种类化,再在后台反体系的秘诀。

图片 38

  $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetByModel",
        contentType: "application/json",
        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 39

        [HttpGet]
        public string GetByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData"   oData.ID;
        }

图片 40

如此在后台获得大家连串化过的靶子,再经过反种类化就会得到目的。

在url里面大家能够见到它自动给目标加了多个编码:

图片 41

关于还有园友们提到的model binder这种艺术,博主看了下,感觉略复杂。有趣味的也得以实施。至于用哪一种方法传递对象,园友们方可自动选拔。

1、基础项目参数

 post请求的根底项目的参数和get请求有点不等同,大家理解get请求的参数是经过url来传递的,而post请求则是经过http的请求体中传过来的,WebApi的post请求也亟需从http的请求体里面去取参数。

三、数组作为参数

貌似get请求不提议将数组作为参数,因为大家领悟get请求传递参数的大大小小是有限制的,最大10二四字节,数组里面内容较多时,将其当做参数字传送递恐怕会爆发参数超过限度丢失的场馆。

(壹)错误的写法

图片 42

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { NAME: "Jim" },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 43

        [HttpPost]
        public bool SaveData(string NAME)
        {
            return true;
        }

那是1种看上去十三分科学的写法,然则实际上处境是:

图片 44

4、“怪异”的get请求

为什么会说get请求“奇怪”呢?大家先来看看下边包车型大巴三种写法相比较。

(二)正确的用法

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { "": "Jim" },
        success: function (data, status) {}
    });

        [HttpPost]
        public bool SaveData([FromBody]string NAME)
        {
            return true;
        }

这是一种另许六人讨厌的写法,可是无法,那样确实能获得大家的结果:

图片 45

大家一般的通过url取参数的体制是键值对,即某二个key等于某三个value,而这里的FromBody和我们一般通过url取参数的机制则分化,它的机制是=value,未有key的定义,并且只要你写了key(比如您的ajax参数写的{NAME:"吉姆"}),后台反而获得的NAME等于null。不信你能够试试。

地点讲的都以传递2个基础项目参数的情况,那么只要大家须求传递多个基础项目呢?依据上边的猜测,是或不是能够([FromBody]string NAME, [FromBody]string DES)那样写吗。试试便知。

(一)WebApi的章程名称以get开头

图片 46

    $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetByModel",
        contentType: "application/json",
        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 47

        [HttpGet]
        public string GetByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData"   oData.ID;
        }

这是规范写法,后台加[HttpGet],参数平常获得:

图片 48

为了比较,笔者将[HttpGet]去掉,然后再调用

        //[HttpGet]
        public string GetByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData"   oData.ID;
        }

图片 49

一般未有任何难点!有人就想,那是不是具有的get请求都足以省略掉[HttpGet]其壹标注呢。大家试试便知。

(一)错误写法

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { "": "Jim","":"备注" },
        success: function (data, status) {}
    });

        [HttpPost]
        public bool SaveData([FromBody]string NAME, [FromBody] string DES)
        {
            return true;
        }

收获结果

图片 50

图片 51

那表达大家不可能通过三个[FromBody]里头取值,此法失利。

(二)WebApi的不二等秘书技名称不以get初始

俺们把在此之前的方法名由GetByModel改成FindByModel,那些再平常不过了,许多人查询就不想用Get开端,还有直接用Query起初的。那几个有如何关联吗?有未有关联,我们以真情说话。

图片 52

    $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/FindByModel",
        contentType: "application/json",
        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 53

        [HttpGet]
        public string FindByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData"   oData.ID;
        }

图片 54

相似又使得,未有别的难题呀。分局方的推论,大家去掉[HttpGet]也是立竿见影的,好,我们讲解掉[HttpGet],运营起来试试。

图片 55

结果是不进断点,有个别人不信,咱们在浏览器里面看看http请求:

图片 56

呵呵,这就奇异了,就改了个方式名,至于那样么?还真至于!

博主的明白是:主意名以Get早先,WebApi会自动暗中认可那些请求就是get请求,而1旦你以其它名目先导而又不标注方式的呼吁格局,那么那个时候服务器即使找到了那些方法,可是由于请求方式不鲜明,所以一向回到给你40五——方法不被允许的不当。

说起底敲定:全体的WebApi方法最佳是增进请求的不二等秘书诀([HttpGet]/[HttpPost]/[HttpPut]/[HttpDelete]),不要偷懒,那样既能幸免类似的荒谬,也便宜方法的爱慕,别人一看就清楚那么些措施是何许请求。

那也正是为啥许几人在园子里面问道为啥方法名不加[HttpGet]就调用不到的来头!

(二)正确用法

既然上边的章程行不通,那大家什么传递多个基础项目标数量吧?诸多的消除办法是新建2个类去涵盖传递的参数,博主认为那样不够灵活,因为只要大家前后台每回传递五个参数的post请求都去新建3个类的话,我们系统到时候会有微微个那种参数类?维护起来那是分外的分神的1件事!所以博主感到使用dynamic是三个很不利的选料。大家来试试看。

图片 57

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify({ NAME: "Jim",DES:"备注" }),
        success: function (data, status) {}
    });

图片 58

        [HttpPost]
        public object SaveData(dynamic obj)
        {
            var strName = Convert.ToString(obj.NAME);
            return strName;
        }

图片 59

因此dynamic动态类型能顺遂得到五个参数,省掉了[FromBody]本条麻烦,并且ajax参数的传递并非选用"无厘头"的{"":"value"}那种写法,有未有一种小清新的感觉~~有有个别索要留意的是这里在ajax的伸手里面要求增添参数类型为Json,即 contentType: 'application/json', 那些天性。

二、post请求

在WebApi的RESETful风格里面,API服务的增加和删除改查,分别对应着http的post/delete/put/get请求。大家上边就来讲说post请求参数的传递情势。

(三)推荐用法

透过上文post请求基础项目参数的传递,大家询问到了dynamic的有益之处,为了幸免[FromBody]那么些麻烦和{"":"value"}那种"无厘头"的写法。博主要推荐荐全数基础项目应用dynamic来传递,方便化解了根基项目贰个或两个参数的传递,示举例上文。假若园友们有越来越好的艺术,迎接斟酌。

1、基础项目参数

 post请求的功底项目标参数和get请求有点不雷同,大家驾驭get请求的参数是经过url来传递的,而post请求则是透过http的请求体中传过来的,WebApi的post请求也急需从http的请求体里面去取参数。

二、实体作为参数

(一)错误的写法

图片 60

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { NAME: "Jim" },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });

图片 61

        [HttpPost]
        public bool SaveData(string NAME)
        {
            return true;
        }

那是壹种看上去万分不易的写法,不过实情是:

博主总计:POST请求,其实下边包车型客车写法也没有错,name能够因此类似于get请求那样,将name参数写在url?后边

 

图片 62

(一)单个实体作为参数

上面大家透过dynamic类型化解了post请求基础项目数据的传递难点,那么当大家必要传递贰个实体作为参数该怎么消除吗?大家来看下边包车型客车代码便知:

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        success: function (data, status) {}
    });

        [HttpPost]
        public bool SaveData(TB_CHARGING oData)
        {
            return true;
        }

获得结果

图片 63

规律解释:应用实体作为参数的时候,前端直接传送普通json,后台平素利用相应的花色去接受就可以,不用FromBody。可是此间要求注意的一点正是,这里不能内定contentType为appplication/json,否则,参数不恐怕传递到后台。我们来探视它暗中同意的contentType是怎样:

图片 64

为了弄明白原因,博主查了下http的Content-Type的品种。看到如下表达:

  • application/x-www-form-urlencoded : <form encType=””>中暗许的encType,form表单数据被编码为key/value格式发送到服务器(表单暗中同意的交给数据的格式);
  • application/json    : JSON数据格式

也正是说post请求暗中同意是将表单里面包车型客车多寡的key/value方式发送到服务,而我们的服务器只须求有照顾的key/value属性值的目标就足以收到到。而只要利用application/json,则意味着将前端的数目以连串化过的json传递到后端,后端要把它成为实体对象,还索要一个反体系化的经过。依照那些逻辑,那我们假使钦赐contentType为application/json,然后传递连串化过的目的应当也是足以的呦。博主好奇心重,依旧准备1试到底,于是就有了下面包车型大巴代码:

图片 65

    var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify(postdata),
        success: function (data, status) {}
    });

图片 66

        [HttpPost]
        public bool SaveData(TB_CHARGING lstCharging)
        {
            return true;
        }

赚取结果:

图片 67

品尝成功,也正是说,三种写法都以有效的。借使您钦点了contentType为application/json,则必要求传送类别化过的对象;若是使用post请求的私下认可参数类型,则前端直接传送json类型的目标就可以。 

(二)准确的用法

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { "": "Jim" },
        success: function (data, status) {}
    });

        [HttpPost]
        public bool SaveData([FromBody]string NAME)
        {
            return true;
        }

那是1种另许多少人头疼的写法,可是不能够,那样真的能赢得大家的结果:

图片 68

大家一般的通过url取参数的编写制定是键值对,即某三个key等于某3个value,而那边的FromBody和大家一般通过url取参数的建制则分歧,它的建制是=value,没有key的定义,并且只要你写了key(例如您的ajax参数写的{NAME:"吉姆"}),后台反而获得的NAME等于null。不信你能够尝试。

地方讲的都以传递七个基础项目参数的情状,那么只要我们须求传递八个基础项目呢?依据上面的推理,是或不是足以([FromBody]string NAME, [FromBody]string DES)这样写啊。试试便知。

(贰)实体和基本功项目一齐作为参数字传送递

稍许时候,大家供给将基础项目和实体一齐传递到后台,那个时候,大家巧妙的dynamic又派上用场了。

图片 69

    var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify({ NAME:"Lilei", Charging:postdata }),
        success: function (data, status) {}
    });

图片 70 图片 71

        [HttpPost]
        public object SaveData(dynamic obj)
        {
            var strName = Convert.ToString(obj.NAME);
            var oCharging = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(Convert.ToString(obj.Charging));
            return strName;
        }

图片 72

收获结果:

图片 73

原理也不用多说,同上。

(一)错误写法

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { "": "Jim","":"备注" },
        success: function (data, status) {}
    });

        [HttpPost]
        public bool SaveData([FromBody]string NAME, [FromBody] string DES)
        {
            return true;
        }

收获结果

图片 74

图片 75

这表达大家无法通过五个[FromBody]里面取值,此法败北。

3、数组作为参数

(贰)准确用法

既是下面的不贰秘诀行不通,那我们怎么着传递三个基础项目的数目吧?诸多的解决办法是新建1个类去涵盖传递的参数,博主认为那样不够灵活,因为假若大家前后台每一遍传递七个参数的post请求都去新建一个类的话,我们系统到时候会有多少个那种参数类?维护起来那是一对1的分神的一件事!所以博主感觉选用dynamic是三个很不错的挑选。大家来试试。

图片 76

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify({ NAME: "Jim",DES:"备注" }),
        success: function (data, status) {}
    });

图片 77

        [HttpPost]
        public object SaveData(dynamic obj)
        {
            var strName = Convert.ToString(obj.NAME);
            return strName;
        }

图片 78

透过dynamic动态类型能可心如意得到多个参数,省掉了[FromBody]以此麻烦,并且ajax参数的传递并非采取"无厘头"的{"":"value"}这种写法,有未有一种小清新的认为~~有几许供给注意的是这里在ajax的请求里面供给加上参数类型为Json,即 contentType: 'application/json', 那天天性。

(一)基础项目数组

图片 79

    var arr = ["1", "2", "3", "4"];
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify(arr),
        success: function (data, status) { }
    });

图片 80

        [HttpPost]
        public bool SaveData(string[] ids)
        {
            return true;
        }

赚取结果:

图片 81

(三)推荐用法

透过上文post请求基础项目参数的传递,我们掌握到了dynamic的有利之处,为了制止[FromBody]其1麻烦和{"":"value"}那种"无厘头"的写法。博首荐荐全数基础项目应用dynamic来传递,方便化解了根基项目3个或多个参数的传递,示比如上文。如若园友们有越来越好的不二等秘书籍,迎接研商。

(2)实体集合

图片 82

    var arr = [
        { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        { ID: "2", NAME: "Lilei", CREATETIME: "1990-12-11" },
        { ID: "3", NAME: "Lucy", CREATETIME: "1986-01-10" }
    ];
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify(arr),
        success: function (data, status) {}
    });

图片 83

        [HttpPost]
        public bool SaveData(List<TB_CHARGING> lstCharging)
        {
            return true;
        }

获得结果:

图片 84

二、实体作为参数

肆、后台发送请求参数的传递

上边写了那么多,都以因在此以前端的ajax请求去做的,我们清楚,如果调用方不是web项目,比方Android客户端,也许供给从后台发送http请求来调用大家的接口方法,假设大家透过后台去发送请求是否也是行得通的啊?大家以实体对象作为参数来传递写写代码试1把。

图片 85

    public void TestReques()
    {
         //请求路径
            string url = "http://localhost:27221/api/Charging/SaveData";

            //定义request并设置request的路径
            WebRequest request = WebRequest.Create(url);
            request.Method = "post";

            //初始化request参数
            string postData = "{ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }";

            //设置参数的编码格式,解决中文乱码
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            //设置request的MIME类型及内容长度
            request.ContentType = "application/json";
            request.ContentLength = byteArray.Length;

            //打开request字符流
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            //定义response为前面的request响应
            WebResponse response = request.GetResponse();

            //获取相应的状态代码
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);

            //定义response字符流
            dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();//读取所有
            Console.WriteLine(responseFromServer);
    }

图片 86

当代码运转到request.GetResponse()这一句的时候,API里面进入断点

图片 87

尝试成功。

(一)单个实体作为参数

上边大家通过dynamic类型解决了post请求基础项目数据的传递难点,那么当大家须要传递多个实体作为参数该怎么消除呢?大家来看上边包车型客车代码便知:

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        success: function (data, status) {}
    });

        [HttpPost]
        public bool SaveData(TB_CHARGING oData)
        {
            return true;
        }

获取结果

图片 88

原掌握释:采纳实体作为参数的时候,前端间接传送普通json,后台从来动用相应的档案的次序去接受就可以,不用FromBody。不过这里需求专注的某个正是,这里不可能钦点contentType为appplication/json,否则,参数无法传递到后台。大家来探望它暗中同意的contentType是何等:

图片 89

为了弄精通原因,博主查了下http的Content-Type的花色。看到如下表明:

  • application/x-www-form-urlencoded : <form encType=””>中暗许的encType,form表单数据被编码为key/value格式发送到服务器(表单默许的交给数据的格式);
  • application/json    : JSON数据格式

也等于说post请求暗许是将表单里面包车型大巴数据的key/value格局发送到服务,而大家的服务器只必要有对应的key/value属性值的靶子就能够收起到。而借使使用application/json,则意味将前端的数码以系列化过的json传递到后端,后端要把它成为实体对象,还亟需1个反连串化的经过。依照那些逻辑,那我们固然钦定contentType为application/json,然后传递体系化过的靶子应当也是足以的呦。博主好奇心重,照旧筹划1试到底,于是就有了上面包车型地铁代码:

图片 90

    var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify(postdata),
        success: function (data, status) {}
    });

图片 91

        [HttpPost]
        public bool SaveData(TB_CHARGING lstCharging)
        {
            return true;
        }

获取结果:

图片 92

品味成功,也正是说,三种写法都是实用的。假若你钦命了contentType为application/json,则必须求传送连串化过的目的;假诺运用post请求的暗中认可参数类型,则前端直接传送json类型的靶子就可以。 

三、put请求

WebApi里面put请求一般用于对象的换代。它和用法和post请求基本一样。同样辅助[FromBody],同样能够利用dynamic。

(二)实体和基础项目一同作为参数字传送递

稍加时候,我们供给将基础项目和实体一同传递到后台,那一年,大家玄妙的dynamic又派上用场了。

图片 93

    var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify({ NAME:"Lilei", Charging:postdata }),
        success: function (data, status) {}
    });

图片 94

图片 95

        [HttpPost]
        public object SaveData(dynamic obj)
        {
            var strName = Convert.ToString(obj.NAME);
            var oCharging = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(Convert.ToString(obj.Charging));
            return strName;
        }

图片 96

赢得结果:

图片 97

原理也不用多说,同上。

一、基础项目参数

图片 98

    $.ajax({
        type: "put",
        url: "http://localhost:27221/api/Charging/Update",
        contentType: 'application/json',
        data: JSON.stringify({ ID: "1" }),
        success: function (data, status) {}
    });

图片 99

        [HttpPut]
        public bool Update(dynamic obj )
        {
            return true;
        }

图片 100

叁、数组作为参数

二、实体作为参数

和post请求一样。

(1)基础项目数组

图片 101

    var arr = ["1", "2", "3", "4"];
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify(arr),
        success: function (data, status) { }
    });

图片 102

        [HttpPost]
        public bool SaveData(string[] ids)
        {
            return true;
        }

获取结果:

图片 103

三、数组作为参数

和post请求相同。

(2)实体集结

图片 104

    var arr = [
        { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        { ID: "2", NAME: "Lilei", CREATETIME: "1990-12-11" },
        { ID: "3", NAME: "Lucy", CREATETIME: "1986-01-10" }
    ];
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify(arr),
        success: function (data, status) {}
    });

图片 105

        [HttpPost]
        public bool SaveData(List<TB_CHARGING> lstCharging)
        {
            return true;
        }

收获结果:

图片 106

四、delete请求

顾名思义,delete请求肯定是用以删除操作的。参数字传送递机制和post也是基本同样。上面轻松给出一个事例,别的景况参考post请求。

图片 107

    var arr = [
        { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        { ID: "2", NAME: "Lilei", CREATETIME: "1990-12-11" },
        { ID: "3", NAME: "Lucy", CREATETIME: "1986-01-10" }
    ];
    $.ajax({
        type: "delete",
        url: "http://localhost:27221/api/Charging/OptDelete",
        contentType: 'application/json',
        data: JSON.stringify(arr),
        success: function (data, status) {}
    });

图片 108

        [HttpDelete]
        public bool OptDelete(List<TB_CHARGING> lstChargin)
        {
            return true;
        }

图片 109

4、后台发送请求参数的传递

地点写了那么多,都以通过前端的ajax请求去做的,大家精通,要是调用方不是web项目,比方Android客户端,恐怕供给从后台发送http请求来调用我们的接口方法,假诺大家因此后台去发送请求是不是也是实用的吗?大家以实体对象作为参数来传递写写代码试1把。

图片 110

    public void TestReques()
    {
         //请求路径
            string url = "http://localhost:27221/api/Charging/SaveData";

            //定义request并设置request的路径
            WebRequest request = WebRequest.Create(url);
            request.Method = "post";

            //初始化request参数
            string postData = "{ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }";

            //设置参数的编码格式,解决中文乱码
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            //设置request的MIME类型及内容长度
            request.ContentType = "application/json";
            request.ContentLength = byteArray.Length;

            //打开request字符流
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            //定义response为前面的request响应
            WebResponse response = request.GetResponse();

            //获取相应的状态代码
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);

            //定义response字符流
            dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();//读取所有
            Console.WriteLine(responseFromServer);
    }

图片 111

当代码运维到request.GetResponse()这一句的时候,API里面进入断点

图片 112

尝试成功。

五、总结

如上比较详细的总括了WebApi各样请求的各个参数字传送递。各类情形都以博主实际代码测试过的,内容简单,但假使刚接触那个东西依然需求一些时日去纯熟的,在此做个小结,希望能帮到刚刚接触WebApi的园友们。假诺本文能帮到你,不要紧推荐下,您的引入是博主继续总括的引力!

接口参数不再嫌疑:传参详解, 看那边小说时的吸引是:WebApi中的参数加了[FromBody],不知所以然,就百度了下,看到了...

三、put请求

WebApi里面put请求一般用于对象的更新。它和用法和post请求基本同样。同样支撑[FromBody],同样能够选取dynamic。

1、基础项目参数

图片 113

    $.ajax({
        type: "put",
        url: "http://localhost:27221/api/Charging/Update",
        contentType: 'application/json',
        data: JSON.stringify({ ID: "1" }),
        success: function (data, status) {}
    });

图片 114

        [HttpPut]
        public bool Update(dynamic obj )
        {
            return true;
        }

图片 115

2、实体作为参数

和post请求同样。

三、数组作为参数

和post请求相同。

四、delete请求

顾名思义,delete请求鲜明是用来删除操作的。参数字传送递机制和post也是基本同样。下边轻便给出三个例证,其余情形参考post请求。

图片 116

    var arr = [
        { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        { ID: "2", NAME: "Lilei", CREATETIME: "1990-12-11" },
        { ID: "3", NAME: "Lucy", CREATETIME: "1986-01-10" }
    ];
    $.ajax({
        type: "delete",
        url: "http://localhost:27221/api/Charging/OptDelete",
        contentType: 'application/json',
        data: JSON.stringify(arr),
        success: function (data, status) {}
    });

图片 117

        [HttpDelete]
        public bool OptDelete(List<TB_CHARGING> lstChargin)
        {
            return true;
        }

图片 118

五、总结

上述比较详细的下结论了WebApi各类请求的各个参数字传送递。各种情形都是博主实际代码测试过的,内容轻易,但壹旦刚接触这几个东西依然供给一些时间去明白的,在此做个小结,希望能帮到刚刚接触WebApi的园友们。假如本文能帮到你,不要紧推荐下,您的推荐是博主继续总括的引力!

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于www.2527.com,转载请注明出处:进阶系列