ASP.NET WebAPI post参数传递
可行的传参形式
- 键值对对应
-
dynamic
动态类型(非跨域) - 实体类
-
JObject
参数(推荐)
1.键值对对应
这里所说的键值对并非是一般的键值对,是指键为空,值不为空的键值对
前台请求
$.ajax({
url: host + '/api/Source/TestParams',
type:"post",
data: { '': "Amon"},
success: function(a) {
console.log(a);
}
}); //12345678
后台
可以看到后台是接收到参数了的,但是这种方式只能传一个键值对参数,{'': 'Amon', '': 'male'}
这种参数是接收不到的,当然也可以把所有参数序列化为字符串,后台再进行反序列化,但是这种方式较为繁琐,所以不推荐
2.dynamic
动态类型(非跨域)
这种传参方式在非跨域环境下可行,但是在跨域环境下,前台请求时会出现 405 错误,虽然通过调整ajax
请求参数会解决这个错误,但是后台无法正常接收参数
前台请求
$.ajax({
url: host + '/api/Source/TestParams',
type:"post",
contentType: 'application/json',
data: JSON.stringify({ 'name': "Amon", sex: 'male'}),
success: function(a) {
console.log(a);
}
});
后台
当前传参方式在非跨域环境中测试为可以正常传参,跨域环境暂未找到解决方法,如果有解决方法,欢迎交流
3.实体类
实体类是相对来说比较简单的一种传参方式,跟我们平常采用的传参方式相似
前台请求
$.ajax({
url: host + '/api/Source/TestParams',
type:"post",
data: { 'name': "Amon", sex: 'male'},
success: function(a) {
console.log(a);
}
});12345678
后台
这种传参方式需要声明一个实体类,所以说在改变传参时,相应的要去更改实体类,灵活性不是很高
4.JObject
参数(推荐)
JObject
传参方式是个人比较推荐的一种方式,前台请求传参写法不具迷惑性,后台接收也较为灵活
前台请求
$.ajax({
url: host + '/api/Source/TestParams',
type:"post",
data: { 'name': "Amon", sex: 'male'},
success: function(a) {
console.log(a);
}
});
后台
如果有其他的传参方式,欢迎交流
webapi 自宿主 post
多个参数
项目需要 java发起请求 调用c#客户端的一个程序,而且要直接通过前台ajax请求 ,不能通过java后台访问c#的接口服务。这样就涉及到跨域问题,如果java后台访问就不涉及到跨域。查阅了很多资料,发现IE对跨域基本上限制要求比较小。在脚本中设置一下跨域cors
支持就可以。webapi通过后台设置跨域支持。还有一个比较头疼的问题就是传参的问题。单一的字符串,对象,或者多个参数 多个字符成员,多个对象也没问题。关键是我这里面对象嵌套对象。在解析的时候遇到很大的问题。最终还是解决了。如果单纯的百度 肯定是永远找不到解决的方式。最终还是通过了解了代码结构找到了解决的方法。直接上方法吧。
$.ajax({
type: "POST",
url: "服务地址",
data: { 对象1: json对象1, 对象2: json对象2 },
success: function (data, status) {
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
},
complete: function () {
}
});
这种方式支持post 一次传递多个参数,如果用JsonStringfy
只能传递一个数据,这样的弊端是,参数不明确。而且为了后台转换方便,你必须单独New一个对象,这样无疑既麻烦 又不明确。
这种方式后台需要方法接收参数类型是 JObject
类型。然后需要先序列化,再反序列化。注意:如果上面的data
你传递的是json
对象,那么需要你再一次序列化,再一次反序列化,直接拿到你想要的对象数据。
var jsonobject = Newtonsoft.Json.JsonConvert.SerializeObject(参数1);
var jsonpara = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(jsonobject);
var jsonborrow = Newtonsoft.Json.JsonConvert.SerializeObject(jsonpara.属性1);
对象 bw = Newtonsoft.Json.JsonConvert.DeserializeObject<对象>(jsonborrow);
var jsonsignAuthority=Newtonsoft.Json.JsonConvert.SerializeObject(jsonpara.属性2);
对象2 signAuthority = Newtonsoft.Json.JsonConvert.DeserializeObject<对象2>(jsonsignAuthority);
webapi自宿主的方式也挺简单
var config = new HttpSelfHostConfiguration("http://localhost:" + System.Configuration.ConfigurationSettings.AppSettings["apiport"].ToString());
config.Routes.MapHttpRoute("default", "api/{controller}/{action}/{id}", new
{
id = RouteParameter.Optional
});
var server = new HttpSelfHostServer(config);
server.OpenAsync().Wait();
推荐阅读
-
js对象转json对象(post请求传递json参数)
-
JSP页面中文参数的传递(get和post方法分析)
-
js对象转json对象(post请求传递json参数)
-
ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据的传递
-
ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据的传递
-
Angularjs中$http以post请求通过消息体传递参数的实现方法
-
JSP页面中文参数的传递(get和post方法分析)
-
php post json参数的传递和接收处理方法
-
AngularJS下$http服务Post方法传递json参数的实例
-
asp.net core webapi处理Post请求中的request payload