WebApi基础
1:当Controller中有相同参数的方法时,请求调用会报错
[HttpGet] public IEnumerable<string> Resturn() { return new string[] { "value1", "value2" }; } public string ResturnResult() { return "Success"; }
原因:webapi默认的路由是不带有action的,所以它无法知道你到底调用的是哪一个!
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); // 取消注释下面的代码行可对具有 IQueryable 或 IQueryable<T> 返回类型的操作启用查询支持。 // 若要避免处理意外查询或恶意查询,请使用 QueryableAttribute 上的验证设置来验证传入查询。 // 有关详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=279712。 //config.EnableQuerySupport(); // 若要在应用程序中禁用跟踪,请注释掉或删除以下代码行 // 有关详细信息,请参阅: http://www.asp.net/web-api config.EnableSystemDiagnosticsTracing(); } }
修改路由为带有action:
config.Routes.MapHttpRoute( name: "DefaultApi1", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
2:参数传递问题
(1)get方式和mvc中一样的
$.ajax({ url: "/api/Values/GetList", type: "get", data: { name: "test1" }, success: function (data) { alert(JSON.stringify(data)); alert(data.length); }, error: function () { alert("失败"); } });
public List<Person> GetList(string name)
{
var PersonList = new List<Person>(){
new Person{Name="test1",Sex="男",Duty="工程师",CompanyName="北京XX科技有限公司"},
new Person{Name="test2",Sex="女",Duty="工程师",CompanyName="北京XX科技有限公司"},
new Person{Name="test3",Sex="男",Duty="工程师",CompanyName="北京XX科技有限公司"}
};
return PersonList.Where(p => p.Name == name).ToList();
}
(2)post提交,如果按照上面的方式是无法获取到参数的;一个参数的post请求和GET请求的方式不一样,后台函数的参数必须用[FromBody]标记,这样才能访问到该函数,如果不加[FromBody] , ASP.NET Web API能够正确的识别我们的 控制器 ,但却不能找到一个可以接受的方法来处理请求。那么后台参数加了[FromBody] ,代码如下是不是就可以请求成功哪?
$.ajax({ url: "/api/Values/GetList", type: "post", data: { name: "test1" }, success: function (data) { alert(JSON.stringify(data)); alert(data.length); }, error: function () { alert("失败"); } }); [HttpPost] public List<Person> GetList([FromBody]string name) { var PersonList = new List<Person>(){ new Person{Name="test1",Sex="男",Duty="工程师",CompanyName="北京XX科技有限公司"}, new Person{Name="test2",Sex="女",Duty="工程师",CompanyName="北京XX科技有限公司"}, new Person{Name="test3",Sex="男",Duty="工程师",CompanyName="北京XX科技有限公司"} }; return PersonList.Where(p => p.Name == name).ToList(); }
答案是失败的,确切的说是可以访问到控制器里的GetList方法的,但是GetList函数的参数是获取不到前台ajax传递过来的值得,为什么呢?是因为Web API 要求请求传递的 [FromBody] 参数,是有一个特定的格式,才能被正确的获取到。而这种特定的格式并不是我们常见的 key=value 的键值对形式。Web API 的模型绑定器希望找到 [FromBody] 里没有键名的值,也就是说, 不是 key=value ,而是 =value 。
所以 将data:{"name":"test1" } 改成data:{"":"test1" } 这样后台函数才可以正确接收到传递过来的参数值。
3:多个参数的POST请求
function GetResult() { var person = { Name: "test1", Sex:"男" }; $.ajax({ url: "/api/Values/GetList", type: "post", data: person, success: function (data) { alert(JSON.stringify(data)); alert(data.length); }, error: function () { alert("失败"); } }); }
[HttpPost] public List<Person> GetList([FromBody]Person per) { var PersonList = new List<Person>(){ new Person{Name="test1",Sex="男",Duty="工程师",CompanyName="北京XX科技有限公司"}, new Person{Name="test2",Sex="女",Duty="工程师",CompanyName="北京XX科技有限公司"}, new Person{Name="test3",Sex="男",Duty="工程师",CompanyName="北京XX科技有限公司"} }; return PersonList.Where(p => p.Name == per.Name && p.Sex == per.Sex).ToList(); }
4:多个对象的传递
根据3中的方式,多个对象就好解决了;采用JSON.stringify传递,后台进行反序列即可;
5:接口测试工具
WebApi接口测试工具:WebApiTestClient http://www.cnblogs.com/landeanfen/p/5210356.html
6:webapi使用场景
选择Web API还是WCF : http://www.cnblogs.com/klsw/archive/2016/03/02/5236621.html