ASP.NET WebAPI post参数传递

可行的传参形式

  1. 键值对对应
  2. dynamic动态类型(非跨域)
  3. 实体类
  4. 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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值