前文介绍了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. 4M宽带一般最大的下载速度是多少?

    4M宽带理论速度=4Mbit/s=4096 Kbit/s=512 KByte/s宽带速度其实是有两个参数的:上行(上传速度).下行(下载速度),一般宽带标为4M其实是说下载速度是4M(即512KB/每 ...

  2. 优先队列求解Huffman编码 c++

    优先队列小析      优先队列的模板: template <class T, class Container = vector<T>,class Compare = less< ...

  3. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

    原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html  之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...

  4. T-SQL 小数点转换百分数

    -- ============================================= -- Author: <Author,,CC> -- Create date: <C ...

  5. dsoframer控件学习小结(打开WORD,EXCEL等文件)

    根据自己对dsoframer控件的学习,想把dsoframer控件进行简单的包装为C#的usercontrol,大体需要作如下:(创建windows的usercontrol的步骤就不再说了...)我们 ...

  6. 关于MySQL redo log,挖些坑,慢慢填

    1. 为什么可以设置为多个redo log ? (innodb_log_files_in_group,默认值和推荐值都是2,我们线上设的统一为4): 2. 什么条件下会触发刷脏?除了master_th ...

  7. Spark源码系列(五)分布式缓存

    这一章想讲一下Spark的缓存是如何实现的.这个persist方法是在RDD里面的,所以我们直接打开RDD这个类. def persist(newLevel: StorageLevel): this. ...

  8. swift 闭包

    闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着 这些常量和变量,俗称闭包. Swift标准库中提供了sort排序函数,sort函数的第二个参数是个闭包.和OC中的bl ...

  9. cordova 学习笔记

    0.sdk安装 http://spring.io/guides/gs/android/ 1.安装(node.js 需要安装https://nodejs.org/) on OS X and Linux: ...

  10. Application MyTest has not been registered. This is either due to a require() error during initialization or failure to call AppRegistry.registerComponent.

    运行react-native项目时报错. 说明一下:项目本来是好的,再次运行就报错了 解决解决办法倒是有,不过具体什么原因不知道.希望有知道具体原因的童鞋能够补充一下 第一种情况:真的是注册的时候写错 ...