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
WebApi基础的更多相关文章
- net core Webapi基础工程搭建(六)——数据库操作_Part 2
目录 前言 开始 使用 小结 前言 昨天是写着写着发现,时间不早了,已经养成了晚上下班抽时间看看能写点儿啥的习惯(貌似),今天实在是不想让昨天没做完的事情影响,所以又坐下,沉下心(周末了),开始把数据 ...
- net core Webapi基础工程搭建(六)——数据库操作_Part 1
目录 前言 SqlSugar Service层 BaseService(基类) 小结 前言 后端开发最常打交道的就是数据库了(静态网站靠边),上一篇net core Webapi基础工程搭建(五)-- ...
- BeetleX和Asp.net Core之webapi基础性能对比
本文主要针对BeetleX和Asp.net Core在基础WebApi功能性能对比 测试环境描述 硬件配置:E1230V2 16G内存 10Gb带宽 操作系统:Windows server 2008 ...
- net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 2
目录 前言 引入 自定义属性 测试 小结 前言 前一篇讲到了中间层的使用,可能不是那么AOP,今天主要来说下一个轻量级的AOP第三方类库AspectoCore. 简单介绍下这个类库,AspectCor ...
- 第十九节:Asp.Net Core WebApi基础总结和请求方式
一. 基础总结 1.Restful服务改造 Core下的WebApi默认也是Restful格式服务,即通过请求方式(Get,post,put,delete)来区分请求哪个方法,请求的URL中不需要写方 ...
- Web API系列之二WebApi基础框架搭建
本文主要介绍如何搭建一个WebApi的项目.关于如何搭建WebApi的方式一共有两种: 一.通过vs直接新建一个WebApi的项目,步骤如下: 第一步: 新建一个空的Web应用程序,可以理解为作为We ...
- 你所不知道的ASP.NET Core MVC/WebApi基础系列(二)
前言 好久没冒泡了,算起来估计有快半年没更新博客了,估计是我第一次停更如此之久,人总有懒惰的时候,时间越长越懒惰,但是呢,不学又不行,持续的惰性是不行dei,要不然会被时光所抛弃,技术所淘汰,好吧,进 ...
- 你所不知道的ASP.NET Core MVC/WebApi基础系列(一)
前言 最近发表的EF Core貌似有点多,可别误以为我只专攻EF Core哦,私下有时间也是一直在看ASP.NET Core的内容,所以后续会穿插讲EF Core和ASP.NET Core,别认为你会 ...
- 你所不知道的ASP.NET Core MVC/WebApi基础系列 (二)
转自博客:https://www.cnblogs.com/CreateMyself/p/10604293.html 前言 本节内容,我们来讲讲.NET Core当中的模型绑定系统.模型绑定原理.自定义 ...
- 你所不知道的ASP.NET Core MVC/WebApi基础系列 (一)
转自博客:https://www.cnblogs.com/CreateMyself/p/9235968.html 前言 最近发表的EF Core貌似有点多,可别误以为我只专攻EF Core哦,私下有时 ...
随机推荐
- iOS数组去重的方法,超级简单
//最近新发现的一个数组去重,用不着循环,一句代码搞定 //去除数组中重复的 NSArray *oldArr = @[@"1",@"2",@"3&qu ...
- webview reload 错误 Error Domain=WebKitErrorDomain Code=102 "Frame load interrupted"
在某个特定的场合先需要对WKWebView进行一次reload,但是直接回走到失败的代理方法中并报如下的错误 Error Domain=WebKitErrorDomain Code=102 " ...
- C#根据经纬度获取物理地址
废话不多说,直接上代码: 1.首先新建几个类,定义一些属性: public class BaiDuGeoCoding { public int Status { get; set; } public ...
- NOI模拟题4 Problem B: 小狐狸(fox)
Solution 考虑分开统计朝向每一个方向的所有狐狸对答案的贡献. 比如说以向右为例, 我们用箭标表示每一只狐狸的方向, 用\('\)表示当前一步移动之前的每一只狐狸的位置. \[ \begin{a ...
- 2016北京集训测试赛(十四)Problem B: 股神小D
Solution 正解是一个\(\log\)的link-cut tree. 将一条边拆成两个事件, 按照事件排序, link-cut tree维护联通块大小即可. link-cut tree维护子树大 ...
- php中for与foreach对比
总体来说,如果数据库过几十万了,才能看出来快一点还是慢一点,如果低于10万的循环,就不用测试了.php推荐用foreach.循环数字数组时,for需要事先count($arr)计算数组长度,需要引入自 ...
- Linux下Shell文件内容替换(sed)(转)
sed -i 's/被替换的内容/要替换成的内容/g' file #-i为直接修改并保存 参考: http://blog.sina.com.cn/s/blog_7211cb9201019hgd.htm ...
- iOS github大全 & iOS7的学习blog
iOS github大全 :有600多个iOS各方面的开源库,并分类了 一天天学习iOS7 :每天学习一点iOS7的新特性
- RHEL CentOS Fedora各种源介绍和安装
CentOS默认自带CentOS-Base.repo源,但官方源中去除了很多有版权争议的软件,而且安装的软件也不是最新的稳定版. 下面介绍各种第三方软件库,以下软件库适用于与RHEL完全兼容的li ...
- 算法之美--2.2 Array
2016-12-02 00:24:12 利用抽象数据类型实现Array:主要用C++模板实现数组类:体会一个完整的C++类的写法,能顺利写出来的人不多了,特别是对复制构造函数和重载= []运算, ...