ASP.NET WebAPI

一、什么是WebAPI?

1.1-什么是WebAPI?

WebAPI是一种用开发系统间接口、设备接口API的技术,基于Http协议,请求和返回格式默认是Json格式。比WCF简单、跟更通用;比WebService更节省流量,更简洁。

 

1.2-WebAPI的特点?

  • Action方法直接返回对象,专注于数据
  • 更符合Restful的风格
  • 有利于独立于IIS部署
  • Action可以直接声明为async

 

 

二、什么是Restful?

2.1-传统的Http接口怎么设计?

image.png

 

2.2-Http设计之初"谓词语义"?

  • GET:查询获取
  • POST:添加
  • Put:修改
  • Delete:删除

 

2.3-Http设计之初"谓词语义"带来的好处是什么?

  • 为不同的请求做不同的权限的控制;
  • 不需要"Delete","AddNew"这样的Action名字,根据请求的类型就可以判断
  • 返回报文的格式也确定,不用在约定返回状态码,充分利用Http状态码
  • 有利于系统优化,浏览器可以自动缓存Get请求
  • Get没有副作用,是幂等的,可以重试。

//返回结果尽量根据Http状态码返回。

 

 

三、简单的WebAPI(.NET Framework)

3.1-简单WebAPI和是使用异步方式调用

   /// <summary>
    /// 需要继承自ApiController
    /// </summary>
    public class PersonController : ApiController
    {
        public string[] Get() {
            return new string[] { "滔滔程序猿", "Albert" };
        }

        public string Get(int id) {
            return $"Haha:" + id;
        }

        public string Get(string name) {
            return name;
        }

    }
}

image.png

 

3.2-WebAPI的参数

image.png

image.png

image.png

image.png

image.png

 

3.3-WebAPI的返回值

image.png

        /// <summary>
        /// HttpResponseMessage类型
        /// 返回报文头、内容等等信息(控制相应的内容)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("Test3")]
        public HttpResponseMessage Test3() {
            HttpResponseMessage msg = new HttpResponseMessage();
            msg.Content =new StringContent( "报文体");
            msg.Headers.Add("Haha", "这是请求头体");
            msg.StatusCode = System.Net.HttpStatusCode.OK;
            msg.Headers.Age = TimeSpan.FromDays(3);
            return msg;
        }

 

3.4-通过自定义路由处理API多版本

image.png

image.png

image.png

 

3.5-通过ControllerSelector实现多版本(配置路由规则)

(1)创建2个版本控制器

image.png

(2)在【WebApiConfig】的Register中,添加1个路由规则,并替换IHttpControllerSelector

 config.Routes.MapHttpRoute(
                name: "DefaultApiV1",
                routeTemplate: "api/v1/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );


            //添加一个路由规则
            config.Routes.MapHttpRoute(
                name: "DefaultApiV2",
                routeTemplate: "api/v2/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );


            //替换
            config.Services.Replace(typeof(IHttpControllerSelector), new VersionControllerSelector(config));

(3)VersionControllerSelector.cs代码如下:

namespace Demo
{
    /// <summary>
    /// 用来控制API版本
    /// 需要继承自DefaultHttpControllerSelector
    /// </summary>
    public class VersionControllerSelector : DefaultHttpControllerSelector
    {
        private readonly HttpConfiguration _config;
        private IDictionary<string, HttpControllerDescriptor> _ctlMapping;

        public VersionControllerSelector(HttpConfiguration config) : base(config)
        {
            this._config = config;
        }


        public override IDictionary<string, HttpControllerDescriptor> GetControllerMapping()
        {
            Dictionary<string, HttpControllerDescriptor> dict = new Dictionary<string, HttpControllerDescriptor>();
            //加载所有程序集,然后遍历
            foreach (var asm in _config.Services.GetAssembliesResolver().GetAssemblies())
            {
                //获得程序集所有的类,并且该类不是抽象类,并且继承自ApiController
                var controllerTypes = asm.GetTypes().Where(u => u.IsAbstract == false && typeof(ApiController).IsAssignableFrom(u));
                //遍历并生成名字
                foreach (var ctrlType in controllerTypes)
                {
                    string ctrolTypeNS = ctrlType.Namespace;//获取命名空间名称
                    var match = Regex.Match(ctrolTypeNS, @"\.v(\d)");//获得需要的名称
                    if (!match.Success)
                    {
                        continue;
                    }

                    string verNum = match.Groups[1].Value;//拿到版本号1提取出来
                    string ctrlTypeName = ctrlType.Name;//拿到类名(PersonController)
                   //拿到匹配的类型
                    var matchController = Regex.Match(ctrlTypeName, @"^(.+)Controller$");
                    if (!matchController.Success)
                    {
                        continue;
                    }

                    string ctrlName = matchController.Groups[1].Value;//得到合法的PersonController
                    string key = ctrlName + "v" + verNum;
                    dict[key] = new HttpControllerDescriptor(_config, ctrlName,ctrlType);
                }
            }
            _ctlMapping = dict;
            return dict;
        }


        public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
        {

            //拿到controller
            string controller =(string)request.GetRouteData().Values["controller"];

            if (_ctlMapping == null) {
                //调用之前的方法拿到,key/value
                _ctlMapping = GetControllerMapping();
            }
           
            // /api/v1/person
            var matchVer = Regex.Match(request.RequestUri.PathAndQuery, @"/v(\d+)/");
            if (!matchVer.Success) {
                //我处理不了,让父类处理
                return base.SelectController(request);
            }
            string verNum = matchVer.Groups[1].Value;//2
            string key = controller + "v" + verNum;
            if (_ctlMapping.ContainsKey(key))
            {
                return _ctlMapping[key];
            }
            else {
                //我处理不了,让父类处理
                return base.SelectController(request);
            }
        }

    }
}

 

3.6-WebAPI中Filter-简单判断是否授权

(1)新建一个类。

image.png

(2)类的代码如下:

namespace Demo.Filter
{
    public class MyAuthorFilter : IAuthorizationFilter
    {
        public bool AllowMultiple => true;

        public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
        {

            IEnumerable<string> userNames;
            if (!actionContext.Request.Headers.TryGetValues("UserName", out userNames)){
                //返回未授权状态码
                return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
            };
            string userName = userNames.First();
            if (userName == "admin")
            {
                return await continuation();
            }
            else {
                //返回未授权状态码
                return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
            }
        }

    }
}

(3)在【WebApiConfig.cs】的Register方法进行注册自定义的Filter。

//注册自己写的Filter
config.Filters.Add(new MyAuthorFilter());

 

3.7-WebAPI的异常处理

//系统错误

image.png

//业务错误

image.png

 

image.png

 

3.8-接口的安全性问题

image.png

image.png

image.png

 

3.9-JWT介绍

image.png

目录

一、什么是WebAPI?

二、什么是Restful?

三、简单的WebAPI(.NET Framework)

四、WebAPI(.NET Core)


3.10-接口安全传输

image.png

 

3.11-项目:用户中心OpenAPI

image.png

image.png

//T_UserGroups(用户组表)

image.png

image.png

image.png

 

3.12-接口服务器写好之后的工作

(1)发布到IIS上

(2)写接口文档(例子):

image.png

 

 

四、WebAPI(.NET Core)

4.1-WebAPI在Core和EntityFramework区别?

image.png

  •  

原文地址:https://blog.csdn.net/qq_41834086/article/details/116651575

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


数组的定义 Dim MyArray MyArray = Array(1‚5‚123‚12‚98) 可扩展数组 Dim MyArray() for i = 0 to 10
\'参数: \'code:要检测的代码 \'leixing:html或者ubb \'nopic:代码没有图片时默认值
演示效果: 代码下载: 点击下载
环境:winxp sp2 ,mysql5.0.18,mysql odbc 3.51 driver 表采用 myisam引擎。access 2003  不同的地方: 
其实说起AJAX的初级应用是非常简单的,通俗的说就是客户端(javascript)与服务端(asp或php等)脚本语言的数据交互。
<% ’判断文件名是否合法 Function isFilename(aFilename)  Dim sErrorStr,iNameLength,i  isFilename=TRUE
在调用的时候加入判断就行了. {aspcms:navlist type=0 } {if:[navlist:i]<6} < li><a href=\"[navlist:link]\" target=\"_top\">[navlist:name]</a> </li>
导航栏调用 {aspcms:navlist type=0}     <a href=\"[navlist:link]\">[navlist:name]</a>
1.引入外部文件: {aspcms:template src=infobar.html} 2.二级下拉菜单 <ul class=\"nav\">
downpic.asp页面:  <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
Cookies是数据包,可以让网页具有记忆功能,在某台电脑上记忆一定的信息。Cookies的工作原理是,第一次由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端
很简单,在需要调用的地方用这种模式 {aspcms:content sort={aspcms:sortid} num=17 order=isrecommend}
网站系统使用ACCESS数据库时,查询时怎么比较日期和时间呢?为什么常常比较出来却是错误的呢?比如早的日期比迟的日期大?
str1=\"1235,12,23,34,123,21,56,74,1232\" str2=\"12\" 问题:如何判断str2是否存在str1中,要求准确找出12,不能找出str1中的1235、123、1232
实例为最新版本的kindeditor 4.1.5. 主要程序: <% Const sFileExt=\"jpg|gif|bmp|png\" Function ReplaceRemoteUrl(sHTML,sSaveFilePath,sFileExt)
用ASP实现搜索引擎的功能是一件很方便的事,可是,如何实现类似3721的智能搜索呢?比如,当在搜索条件框内输入“中国人民”时,自动从中提取“中国”、“人民”等关键字并在数据库内进行搜索。看完本文后,你就可以发
首先感谢ASPCMS官网注册用户xing0203的辛苦付出!一下为久忆YK网络转载原创作者xing0203的文章内容!为了让小白更加清楚的体验替换过程,久忆YK对原文稍作了修改!
数据库连接: <% set conn=server.createobject(\"adodb.connection\") conn.open \"driver={microsoft access driver (*.mdb)};dbq=\"&server.mappath(\"数据库名\")
第1步:修改plugins下的image/image.js 找到\'<input type=\"button\" class=\"ke-upload-button\" value=\"\' + lang.upload + \'\" />\',
asp函数: <% Const sFileExt=\"jpg|gif|bmp|png\" Function ReplaceRemoteUrl(sHTML,sSaveFilePath,sFileExt)