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