ASP.NET WebAPI 实战问题总结(一)
来源:互联网 发布:淘宝网成唯识论直解 编辑:程序博客网 时间:2024/05/22 14:35
序言
最近有个项目需要用到webaAPI来做后台处理,关于webAPI,网上资料相对较少,相关的书籍也比较少,能系统讲解的视频几乎没有,遇到问题往往都只能自己摸索摸索,作为初学WebApi 的我来说是想当痛苦。当然,有了MVC的经验,学WebApi并不难,但这里有一些坑,这也是我写这篇博客的目的,希望能和大家分享。
WebAPI和MVC的区别
WebApi和MVC形式上看起来很相近,但其实是完全不同的两个东西,这里我应用网上查到的一张图片
由上观之,MVC和WebApi虽然是亲戚,但还是隔的有点远。
从使用和是哪个来说,MVC多用于建站,返回的是网页,WebAPI多用于构建Http服务,一般来说是没有网页的,返回的多为json或xml数据流。
WebAPI的路由规则
想让我们来看看MVC的路由规则
routes.MapRoute(
name: “Default”,
url: “{controller}/{action}/{id}”,
defaults: new { controller = “Home”, action = “Index”, id = UrlParameter.Optional }
默认的路由规则是 controller+action+id 的结构,通过访问控制器下面的方法去出来具体的http请求。
而我们webAPI的默认路由规则是这样的
config.Routes.MapHttpRoute(
name: “DefaultApi”,
routeTemplate: “api/{controller}/{id}”,
defaults: new { id = RouteParameter.Optional }
);
这里我们注意,没有action!!!这是个很奇怪的问题,没有action,API是怎么知道他要访问的是那个方法呢?尤其是当一个控制器内有很多相同参数的方法时。难道我们的API就只能写一个方法吗?
当然不是,让我们来看看使用vs自动生成的控制器
////返回所有用户信息
// GET: api/UserBaseInfoes
public IQueryable GetUserBaseInfoSet()
{
return db.UserBaseInfoSet;
}
这是其中一段代码,上方自动标注了相关的url,经查证,所有方法前面都有Get,Post,Put或者Delete,这正好是http中的四种方法,所以我猜测API是通过前面的这个标识来识别方法的,但又有个问题,如果同时有两个get的方法,比如
GetUserInfo(int ID)
GetUserFriend(int ID)
那么这样的话,只有自定义路由 了
//自添
config.Routes.MapHttpRoute(
name: “ActionApi_id”,
routeTemplate: “api/{controller}/{action}/{id}”,
defaults: new { id = RouteParameter.Optional });
这样,我们的自定义的路由就可以解决找不到方法的问题了,那么,方法重载呢?
比如:
GetUserInfo(int id)
GetUserInfo(string name)
如果我只传一个1进去,api怎么知道我是传的int还是string呢?
当然,实际尝试过之后就会发现,根本不会调用String参数的方法,这是为什么呢?原因终于一条不成文的规定, “api/{controller}/{action}/{id}”中id必须对应参数名id,即 GetUserInfo(int id),不然会找不到资源返回404,所以这也是为什么上面例子中不会调用string参数的原因。当我们要使用string 参数时,只要在加一条路由规则就好了,当然里面不是写id,而是写name
默认返回json
webApi默认返回xml,但是xml格式往往让人觉得很不舒服,解析时间太长,消耗太多资源以及浪费用户流量。所以一帮网络中常用json作为通信媒介。那么我们要让webAPI默认返回json要怎么做呢,只需要在刚刚我们修改路由的地方加上下面这句
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
大意就是将原来xml格式设定给移去,然后json去掉json的内处理循化(具体机制我没有仔细研究,反正加上这两句话,你返回的内容就是全是json了)
跨域访问
(什么是跨域访问请参考)
当我们和前端对接的时候,我们经常遇到一些问题,比如跨域访问。一般跨域访问的处理方式是在http请求头上添加”Access-Control-Allow-Origin” value=”*”,在这里,我们的处理方式是在web.config文件中
> <httpProtocol>> > <customHeaders>> > <add name="Access-Control-Allow-Origin" value="*" />> > <add name="Access-Control-Allow-Headers" value="Content-Type" />> > <add name="Access-Control-Allow-Methods" value="GET, POST, PUT,> DELETE, OPTIONS" />> > </customHeaders>> > </httpProtocol>
自定义http请求头,那么我们的跨域访问就完成了
- ASP.NET WebAPI 实战问题总结(一)
- asp.net mvc 的webApi (一)自己手动创建
- 基于ASP.NET WebAPI OWIN实现Self-Host项目实战
- 【WebApi】————.net WebApi开发(一)
- ASP.NET WEBApi
- Asp.net WebAPI Ioc
- Asp.net WebAPI 单元测试
- ASP.NET for WebApi
- asp.net创建webapi
- Asp.net总结(一)
- asp.net总结(一)
- asp.net总结(一)
- 使用ASP.Net WebAPI构建REST服务(一)——简单的示例
- 使用ASP.Net WebAPI构建REST服务(一)——简单的示例
- 使用ASP.Net WebAPI构建REST服务(一)——简单的示例
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(一)-- 起步
- Asp.net WebApi + EF 单元测试架构 DbContext一站到底
- ASP.NET MVC学习系列(一)-WebAPI初探
- MYSQL数据库(四) 数据插入、空值和非空判断、自动排序、主键约束、唯一约束
- OpenGL基本操作与SOIL库和assimp库的使用
- exec()方法
- qt串口通信学习笔记
- 【错误】java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
- ASP.NET WebAPI 实战问题总结(一)
- 网络编程中Nagle算法和Delayed ACK的测试
- 解决:Gradle project refresh failed Failed to open zip file 方法
- react native RefreshControl 使用详解
- php 下线预览pdf
- 大端与小端存储模式详解
- 【云栖风向标】VOL.1:勒索病毒频发!445端口守护指南
- 关于Android手机设置好Vpn之后无法连接到服务器
- JVM 内存模型和垃圾回收(四): 并发回收(Concurrent Mark-Sweep Collector)