c# webapi的参数传递方式:1、查询字符串(query string);2、内容主体(content body)
当然也有cookie或url部分或头部信息(header)等其它传方式,这里仅讨论这两种。
1、查询字符串(query string)
如果是简单数据类型或使用了FromUri特性修饰的参数,将使用查询字符串作为数据源。
例1:因为参数p为复合类型,默认使用request body做为数据源,所以如果想以query string为数据源,则不能省略 FromUri修饰。
1 ///2 /// 8 public class Test : ApiController 9 {10 public string Post([FromUri]string[] p)11 {12 if (p == null)13 return "NULL";14 else if (p.Length == 0)15 return "EMPTY";16 else return string.Join(",", p);17 }18 }3 /// 调用方式: 4 /// test?p=1&p=2 5 /// test?p[]=1,2 6 /// 7 ///
例2:
1 ///2 /// 7 public class Test : ApiController 8 { 9 public string Post(string p)10 {11 if (p == null)12 return "NULL";13 else if (p.Length == 0)14 return "EMPTY";15 else return string.Join(",", p);16 }17 }3 /// 调用方式: 4 /// test?p=1 5 /// 6 ///
2、内容主体(content body)
如果是复合数据类型或使用了FromBody特性修饰的参数,将使用内容主体作为数据源。在webapi中,body不会被缓存,仅可获取一次,故只能对body接收一次参数,所以不适合传递多参数数据。
例1:x-www-form-urlencoded编码方式时,注意不能带参数名。
1 ///2 /// 10 public class TestController : ApiController11 {12 public string Post([FromBody]string[] p)13 {14 if (p == null)15 return "NULL";16 else if (p.Length == 0)17 return "EMPTY";18 else return string.Join(",", p);19 }20 }3 /// post请求头: 4 /// Content-Type: application/x-www-form-urlencoded 5 /// Cache-Control: no-cache 6 /// 7 /// =v1&=v2 8 /// 9 ///
例2:Content-Type为json时
1 ///2 /// 10 public class TestController : ApiController11 {12 public string Post([FromBody]string[] p)13 {14 if (p == null)15 return "NULL";16 else if (p.Length == 0)17 return "EMPTY";18 else return string.Join(",", p);19 }20 }3 /// post请求头: 4 /// Content-Type: application/json 5 /// Cache-Control: no-cache 6 /// 7 /// ["v1","v2"] 8 /// 9 ///