前文介绍了Form Data 形式传参,本文介绍json传参。

WebApi及Model:

    public class ValuesController : ApiController
{ [HttpPost]
public string GetData(string name,[FromBody]Woman woman)
{
return "我是" + name + ",我喜欢" + woman.Name;
}
[HttpPost]
public string GetData(Woman woman)
{
return woman.Age + "的" + woman.Name;
} }
public class Woman//放在此处仅仅为了演示方便
{
public string Name{get;set;}
public string Age{get;set;}
public List<DateTime> ExerciseTime { get; set; }
public List<Son> Son { get; set; }
}
public class Son
{
public string Name{get;set;}
public int Age{get;set;}
public List<DateTime> EatTime { get; set; }
}

1、js

        var woman = {
Name: '刘亦菲',
Age: 18,
ExerciseTime: [new Date(), new Date("2015-11-2 15:00:00")],
Son: [
{
Name: '欧巴555',
Age: 1,
EatTime: [new Date('2015-11-2 9:0:0'), new Date('2015-11-2 19:00:00')]
}
]
};
$(function () {
$('#btn').click(function () {
$.ajax({
type: "post",
url: "http://localhost:7601/api/values/GetData?name=楼主",
contentType: "application/json",
data: JSON.stringify(woman),
success: function (r) {
alert(r);
}
});
});
});

执行结果:

可以看到的是:较为复杂的值,都正确传递过来了。唯一特别的是时间,传递过来的是utc世界时间,落后北京时间8小时,需要ToLocalTime一下。

2、客户端调用。我们采取HttpClient异步方式发起请求。

来看包装的方法。

        public static async void AsyncPostApiRequest(string postUrl, string postJson, int seconds)
{
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
using (var http = new HttpClient(handler))
{
http.Timeout = TimeSpan.FromSeconds(seconds);
var content = new StringContent(postJson);
//与jq的ajax方法中的contentType: "application/json"一样,告诉服务端发送过来的数据按json字符串处理
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
CancellationTokenSource cts = new CancellationTokenSource();
try
{
var response = await http.PostAsync(postUrl, content, cts.Token); //await异步等待回应
//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
{
string result = (await response.Content.ReadAsStringAsync());
}
}
catch (TaskCanceledException e)
{
}
catch (Exception ex)
{
}
// 调用Cancel方法取消网络请求
if (cts.Token.CanBeCanceled)
{
cts.Cancel();
cts.Dispose();
cts = null;
}
}
}

调用的方法:

        private void btnPost_Click(object sender, EventArgs e)
{
var women = new
{
Name = "刘亦菲",
Age = ,
ExerciseTime = new List<DateTime>() {
DateTime.Now.Date.AddHours(),
DateTime.Now.Date.AddHours()
},
Son =new object[]{ new {//因为匿名类的原因,此处不能用List,只能用object数组
Name = "欧巴555",
Age = ,
EatTime = new List<DateTime>(){//此处是强类型,因此可以规范数据
DateTime.Now.Date.AddHours(),
DateTime.Now.Date.AddHours()
}
}},
};
string postdata = JsonConvert.SerializeObject(women);
string url = "http://localhost:7601/api/values/GetData?name=楼主";
PostService.AsyncPostApiRequest(url, postdata, );
}

结果:

可以看到,数据被正确的传递进来了,而且时间是Local的。

总结:json传参方法最为简单、直观、顺畅、灵活,建议WebApi传参用此方法。

最复杂传参,以客户端代码为例,js差不多。

WebApi:

        [HttpPost]
public string GetData(string name, Woman woman,Son son)
{
return "我是" + name + ",我喜欢" + woman.Name+"我们有一个共同的孩子叫:"+son.Name+"每天第一次吃奶的时间:"+son.EatTime[];
}

预想的结果:name、woman、son均可以自动获取各自正确的值。

客户端代码:

        private void btnPost_Click(object sender, EventArgs e)
{
var women = new
{
Name = "刘亦菲",
Age = ,
ExerciseTime = new List<DateTime>() {
DateTime.Now.Date.AddHours(),
DateTime.Now.Date.AddHours()
},
Son =new object[]{ new {//因为匿名类的原因,此处不能用List,只能用object数组
Name = "欧巴555",
Age = ,
EatTime = new List<DateTime>(){//此处是强类型,因此可以规范数据
DateTime.Now.Date.AddHours(),
DateTime.Now.Date.AddHours()
}
}},
};
var son = new {
Name = "楼菲子",
Age = ,
EatTime = new List<DateTime>(){//此处是强类型,因此可以规范数据
DateTime.Now.Date.AddHours(),
DateTime.Now.Date.AddHours()
} };
string postdata = JsonConvert.SerializeObject(new { women=women,son=son});
string url = "http://localhost:7601/api/values/GetData?name=楼主";
PostService.AsyncPostApiRequest(url, postdata, );
}

然而这没什么乱用:

这就引出最后一种最复杂类型的传参,我们下回分解。

WebApi传参总动员(四)的更多相关文章

  1. WebApi传参总动员(一)

    目前自己的工作和WebApi相关,免不了传入.接收参数.以前的老办法是从请求流中获取json,再反序列化,这中间有2个不能控制的地方,一个是流,一个是反序列化,都需要try,总感觉非常的不爽.因此对W ...

  2. WebApi传参总动员(五)

    上回说到涉及多个实体的传参,用常规的方法已经不能解决了.这回我们用终极大招搞定她. WebApi:注意要引用JSON.Net [HttpPost] public string GetData(stri ...

  3. WebApi传参总动员(三)

    上篇介绍了如何从输入流中获取实体对象.本篇介绍以url形式传递参数.简单的参数不再赘述,这里主要实现形如(string name,Woman woman)这样的参数传递. 本篇及后面几章均涉及js调用 ...

  4. WebApi传参总动员(填坑)

    本以为系列文章已经Over,突然记起来前面留了个大坑还没填,真是自己给自己挖坑. 这个坑就是: (body 只能被读取一次)Only one thing can read the body MVC和W ...

  5. WebApi传参总动员(二)

    上篇,从最简单的string入手.本篇演示了从请求的输入流中获取实体.api: public class ValuesController : ApiController { [HttpPost] p ...

  6. C# WebApi传参之Post请求-AJAX

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷.  学无止境,精益求精    上一节讲述了C# WebApi传参之Get请求 ...

  7. C# WebApi传参之Get请求-AJAX

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷.  学无止境,精益求精    在介绍本篇博客之前,先来温故下AJax的请求, ...

  8. WebAPI传参

    1.GET请求传递参数 URL传参:http://localhost/ApiTest/test?id=1 API接收参数 [HttpGet] public string GetUser(int id) ...

  9. Angular页面传参的四种方法

    1. 基于ui-router的页面跳转传参 (1)在Angular的app.js中用ui-route定义路由,比如有两个页面, 一个页面(producers.html)放置了多个producers,点 ...

随机推荐

  1. Nagios 安装配置

    ##Debian 6 安装server # apt-get install nagios* 一路设置好各种密码,成功后访问 http://ip/nagios3 既可,默认用户*nagiosadmin* ...

  2. 同时大量PPPoE连接请求,攻击PPPoE服务器,导致的用户异常掉线故障分析

    前几天接一个客户电话,PPPoE下用户异常掉线,掉线后拨号困难 到达后,我首先查看PPPoE日志,发现一秒钟内有大量PADI包,浪费服务器的SESSION,同时让服务器无法处理其他用户的请求. 打开W ...

  3. Gamma校正与线性工作流

    1 Gamma校正是什么?8位亮度值x(0-1)经过x^0.45的一个提亮过程. 2 为什么需要Gamma校正 人的眼睛是以非线性方式感知亮度,在自然界中,人感觉到的一半亮度其实只有全部能量的0.2, ...

  4. Windows 8.1 Preview 开发资源汇总

    Microsoft Build 2013开发者大会已经结束,从Session安排上看主要以Windows 8.1为主.我相信大家有已经或多或少的体验过Windows 8.1 Preview了,关于操作 ...

  5. MSIL解析一(转)

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/15/857140.html 在网上发现了一个非常好的MSIL教程,可惜是英文版的,于是就翻译了 ...

  6. Raspberry Pi --操作LED

    最简单的一个树莓派GPIO操作入门,这里记录以下 先上连接图: 卧槽.图真特么的大 用到了GPIO的GND和#18针脚,这就不上图了,红色的线接的是18针脚,暗色的线接的是GND针脚,下面上Pytho ...

  7. 【NS2仿真】RTP协议安装

    来自: http://personales.upv.es/fboronat/Research/NS2_RTP/NS2_RTP_RTCP_module.htm 文件:http://pan.baidu.c ...

  8. sublime text 3安装package console

    打开Packages目录,Preferences > Browse Packages 就可以进入这个目录. $ cd Packages/$ git clone https://github.co ...

  9. EditorWindow中手动控制焦点

    在Unity3D中制作编辑器的时候,有时候会需要手动控制界面上控件的焦点,与此相关的有三个函数都在下面的示例代码中了: public void Test() { // 给控件命名 GUI.SetNex ...

  10. mvc4.0添加EF4.0时发生编译时错误

    解决此问题是因为MVC4.0默认未添加EF4.0的引用,EF4.0引用的是System.Data.Entity.dll, Version=4.0.0.0, 解决办法: 在web.config文件sys ...