欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ASP.NET WebAPI post参数传递

程序员文章站 2022-04-03 08:58:53
...

可行的传参形式

  1. 键值对对应
  2. dynamic动态类型(非跨域)
  3. 实体类
  4. JObject参数(推荐)

1.键值对对应

这里所说的键值对并非是一般的键值对,是指键为空,值不为空的键值对
前台请求

$.ajax({
    url: host + '/api/Source/TestParams',
    type:"post",
    data: { '': "Amon"},
    success: function(a) {
        console.log(a);
    }
}); 	//12345678

后台
ASP.NET WebAPI post参数传递
可以看到后台是接收到参数了的,但是这种方式只能传一个键值对参数,{'': '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);
    }
});

后台
ASP.NET WebAPI post参数传递
当前传参方式在非跨域环境中测试为可以正常传参,跨域环境暂未找到解决方法,如果有解决方法,欢迎交流

3.实体类

实体类是相对来说比较简单的一种传参方式,跟我们平常采用的传参方式相似

前台请求

$.ajax({
    url: host + '/api/Source/TestParams',
    type:"post",
    data: { 'name': "Amon", sex: 'male'},
    success: function(a) {
        console.log(a);
    }
});12345678

后台
ASP.NET WebAPI post参数传递
ASP.NET WebAPI post参数传递
这种传参方式需要声明一个实体类,所以说在改变传参时,相应的要去更改实体类,灵活性不是很高

4.JObject 参数(推荐)

JObject传参方式是个人比较推荐的一种方式,前台请求传参写法不具迷惑性,后台接收也较为灵活

前台请求

$.ajax({
    url: host + '/api/Source/TestParams',
    type:"post",
    data: { 'name': "Amon", sex: 'male'},
    success: function(a) {
        console.log(a);
    }
});

后台
ASP.NET WebAPI post参数传递
如果有其他的传参方式,欢迎交流


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();
相关标签: ASP.NET Web API