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
最新文章
- jQuery的几个应例题、JSON基础
- Spark Application的调度算法
- php5.3新特性 之 mysql native driver(mysqlnd)
- 在Linux中永久设置Anaconda环境变量的方法
- 使用WebView视图显示网页-----迷你浏览器
- Java开发核心技术面试心得分析
- html 模板 swig 预编译插件 grunt-swig-precompile
- Cloud Insight 现在已经支持监控 Cassandra 啦!
- UDP的崛起
- Redis 11种Web应用场景举例
- python中金额计算的小问题
- django rest framework serializers
- [Swift]LeetCode488. 祖玛游戏 | Zuma Game
- eclipse编译器显示的文件名乱码,活动标签乱码(已解决)
- LwIP-网络接口管理
- Oracle ebs 数据脱敏
- haar的简单应用(2)
- B. Array
- Leetcode88_Merge Sorted Array_Easy
- ListView and gridview常用属性