c#代码生成URL地址的示例

目录
  • “头疼”
  • “吃药”
    • 工具代码
    • 使用代码

“头疼”

自己在用Angular做项目时,前端要请求后端数据时的代码如下

this.http.get("url/xxx")

这是请求一个URL地址数据最简单的代码,但是如此简单的代码还会遇到一些头疼的问题

  • URL地址拼写错误,有可能折腾半天才发现😑
  • 后端修改了地址没通知到前端,测试不到位就炸了,不是所有项目都有那么规范的接口变更流程😑
  • 查看代码的时候,看着URL地址,这个地址用途是哈?还要翻接口文档😑

“吃药”

为了解决这个问题,我们需要一个包含所有接口的文件

import { environment } from 'src/environments/environment';
export const WebAPI = {
  /** 授权控制器 */
  Auth: {
  	/** */
    Controller: `${environment.host}/api/Auth`,
    /** GET 获得用户 */
    GetUser: `${environment.host}/api/Auth/GetUser`,
    /** POST 登陆 */
    Login: `${environment.host}/api/Auth/Login`,
  },
}

那么请求代码就可以改成

this.http.get(WebAPI.Auth.GetUser)

但是维护这个文件是件吃力的事情,作为一个时刻想着如何偷懒的程序员,吃力的事情就让计算机去干,所以写一个代码生成工具。

工具代码

    public static class BuildWebApiToTS
    {
        public static string Build(Assembly assembly, string prefix = "api/")
        {
            List<Controller> controllers = GetApis(assembly);
            string code = CreateCode(controllers);
            return code.ToString();
        }

        public static void BuildToFile(Assembly assembly, string path, string prefix = "api/")
        {
            var code = Build(assembly, prefix);
            string existsCode = "";
            if (System.IO.File.Exists(path) == true)
                existsCode = System.IO.File.ReadAllText(path);

            if (existsCode != code)
                System.IO.File.WriteAllText(path, code);
        }

        #region 构造代码

        public static string CreateCode(List<Controller> controllers, string prefix = "api/")
        {
            StringBuilder code = new StringBuilder();
            code.AppendLine("import { environment } from 'src/environments/environment';");
            code.AppendLine("export const WebAPI = {");
            foreach (var coll in controllers.OrderBy(x => x.Name))
            {
                code.AppendLine($"  /** {coll.ApiComments?.Title} */");
                code.AppendLine($"  {coll.Name}: {{");
                code.AppendLine($"    Controller: `${{environment.host}}/{prefix}{coll.Name}`,");
                foreach (var action in coll.Actions.OrderBy(x => x.Name))
                {
                    code.AppendLine($"    /** {action.Type} {action.ApiComments?.Title} */");
                    code.AppendLine($"    {action.Name}: `${{environment.host}}/{prefix}{coll.Name}/{action.Name}`,");
                }
                code.AppendLine($"  }},");
            }
            code.AppendLine($"}};");
            return code.ToString();
        }

        #endregion

        #region 获得接口清单

        public static List<Controller> GetApis(Assembly assembly)
        {
            List<Controller> controllers = new List<Controller>();
            var collTypes = assembly.GetTypes().Where(x => x.GetCustomAttributes(typeof(ApiControllerAttribute), false).Count() > 0);
            foreach (var collType in collTypes)
            {
                var controller = new Controller(collType.Name.Replace("Controller", ""));
                controller.ApiComments = collType.GetCustomAttribute<ApiCommentsAttribute>();
                controllers.Add(controller);
                controller.Actions.AddRange(GetTypeMembers(collType, typeof(HttpGetAttribute), "GET"));
                controller.Actions.AddRange(GetTypeMembers(collType, typeof(HttpPostAttribute), "POST"));
                controller.Actions.AddRange(GetTypeMembers(collType, typeof(HttpPutAttribute), "PUT"));
                controller.Actions.AddRange(GetTypeMembers(collType, typeof(HttpDeleteAttribute), "DELETE"));
            }
            return controllers;
        }
        private static List<Action> GetTypeMembers(Type type, Type whereType, string saveType)
        {
            var actonTypes = type.GetMembers().Where(x => x.GetCustomAttributes(whereType, false).Count() > 0);
            List<Action> actons = new List<Action>();
            foreach (var actonType in actonTypes)
            {
                var action = new Action(saveType, actonType.Name);
                action.ApiComments = actonType.GetCustomAttribute<ApiCommentsAttribute>();
                actons.Add(action);
            }
            return actons;
        }

        public record Controller(string Name)
        {
            public ApiCommentsAttribute ApiComments { get; set; }
            public List<Action> Actions { get; set; } = new List<Action>();
        }

        public record Action(string Type, string Name)
        {
            public ApiCommentsAttribute ApiComments { get; set; }
        }

        #endregion
    }

    public class ApiCommentsAttribute : Attribute
    {
        public string Title { get; set; }
        public ApiCommentsAttribute(string title)
        {
            Title = title;
        }
    }

使用代码

#if DEBUG
	BuildWebApiToTS.BuildToFile(typeof(Program).Assembly, "ClientApp/src/app/web-api.ts");
#endif

上面代码大概的流程就是

  1. 利用反射读取程序集中包含ApiControllerAttribute特性的类
  2. 利用发射读取HttpGetAttributeHttpPostAttributeHttpPutAttributeHttpDeleteAttribute特性的方法
  3. 根据需要的格式生成代码
  4. 将代码文件写入ClientApp/src/app/web-api.ts

有了这个东西带来以下好处

  1. URL地址拼写错误问题,不存在的🎉
  2. 后端修改了接口,前端直接编译不过,立即发现问题🎉
  3. 鼠标停留,接口注释就显示了🎉

以上就是c#代码生成URL地址的方法的详细内容,更多关于c#代码生成URL地址的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#自定义针对URL地址的处理类实例

    本文实例讲述了C#自定义针对URL地址的处理类.分享给大家供大家参考.具体分析如下: 这个C#类是专门针对URL网址处理的类,可以对URL地址进行Base64的加密和解密,可以通过函数的方式向URL添加参数,可以更新URL中已有参数的值,分析URL地址的域名.子域名,分析URL的所有参数和参数值,功能非常全面,还可以自己扩充,非常具有实用价值 using System; using System.Text.RegularExpressions; using System.Web; using S

  • c#动态改变webservice的url访问地址

    1.添加一个App.config配置文件. 2.配置服务http://Lenovo-PC:80/EvisaWS/WharfService?wsdl,那么在上面的文件中就会自动生成服务的配置: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?><configuration>    <system.serviceModel>        <bindings>       

  • C# URL短地址压缩算法及短网址原理解析

    短网址应用已经在全国各大微博上开始流行了起来.例如QQ微博的url.cn,新郎的sinaurl.cn等. 我们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://url.cn/2hytQx 为什么要这样做的,原因我想有这样几点: 微博限制字数为140字一条,那么如果我们需要发一些连接上去,但是这个连接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允许的,所以短网址应运而生了. 短网址可以在我们项目里可以很好的对开放级URL进行管理.有一部分网址可以会涵盖

  • C#实现类似新浪微博长URL转短地址的方法

    本文实例讲述了C#实现类似新浪微博长URL转短地址的方法.分享给大家供大家参考.具体如下: 一.前台判断用户输入URL的JS代码如下. function CheckInput() { var $txtLength = $("#inp_text").val().length; if ($txtLength > 10) { var url = $("#inp_text").val(); var xx = url.match(RegExp("((news|

  • C#利用System.Uri转URL为绝对地址的方法

    本文实例讲述了C#利用System.Uri转URL为绝对地址的方法.分享给大家供大家参考.具体分析如下: 在使用ASPOSE.Word生成Word文档时可以通过InsertHtml(html)来将图文信息写入Word文档(图片内嵌),但要求html里图片的src是绝对全路径,所以需要对html进行转化. 获取html可以来自数据库数据或者通过网络抓取,得到之后使用System.Uri来进行替换即可. 示例如下: Uri uri = new Uri(http://www.baidu.com); U

  • C#检查字符串是否是合法URL地址的方法

    本文实例讲述了C#检查字符串是否是合法URL地址的方法.分享给大家供大家参考.具体实现方法如下: protected string HTTPChecker(string Value) { if((Value.Substring(0,7) != "http://") && (Value.Substring(0,8) != "https://")) { Value = "http://" + Value; } return Value

  • c#代码生成URL地址的示例

    目录 "头疼" "吃药" 工具代码 使用代码 "头疼" 自己在用Angular做项目时,前端要请求后端数据时的代码如下 this.http.get("url/xxx") 这是请求一个URL地址数据最简单的代码,但是如此简单的代码还会遇到一些头疼的问题 URL地址拼写错误,有可能折腾半天才发现

  • JavaScript实现url地址自动检测并添加URL链接示例代码

    背景:写一个简单的聊天系统,发出Htpp的Url实现跳转加上a标签. 实现代码: 复制代码 代码如下: String.prototype.httpHtml = function(){ var reg = /(http:\/\/|https:\/\/)((\w|=|\?|\.|\/|&|-)+)/g; return this.replace(reg, '<a target=_blank href="$1$2">$1$2</a>'); }; 摘录: URL地

  • PHP实现获取url地址中顶级域名的方法示例

    本文实例讲述了PHP实现获取url地址中顶级域名的方法.分享给大家供大家参考,具体如下: parse_url()获取到的host时多级域名,如:mp.weixin.qq.com.做域名黑名单的时候我们需要得到顶级域名. 有不足之处还请留言指正,谢谢. <?php /** * @Author: Ding Jianlong * @Date: 2019-03-07 16:14:04 * @Last Modified by: Ding Jianlong * @Last Modified time: 20

  • php获取当前页面完整URL地址

    使用PHP编写程序的时候,我们常常想要获取当前页面的URL.下面提供一个用于获取当前页面URL的函数以及使用方法: 示例一: <?php // 说明:获取完整URL function curPageURL() { $pageURL = 'http'; if ($_SERVER["HTTPS"] == "on") { $pageURL .= "s"; } $pageURL .= "://"; if ($_SERVER[&q

  • 对URL地址进行编码 优化2

    ASP(Active Server Page)是 Microsoft 公司推出的基于 PWS (Personal Web Server)& IIS (InternetInformation Server)平台的.基于 ISAPI (InternetServiceAPI) 原理的动态网页开发技术,目前日趋成熟完善.在这里仅就代码优化进行一些简单讨论.  1.声明VBScript变量 在ASP中,对vbscript提供了强劲的支持,能够无缝集成vbscript的函数.方法,这样给扩展ASP的现有功能

  • 解决vue中无法动态修改jqgrid组件 url地址的问题

    在项目开发中使用封装的jqgrid组件时需要动态修改URL地址,直接修改URL地址jqgrid请求的url地址并不会改变,这时我们可以强行修改jqgrid的url地址,修改如下: $("#accountGrid").setGridParam( //G,P要大写 { url:UrlService.url('www/1') } ) .trigger("reloadGrid"); 以上这篇解决vue中无法动态修改jqgrid组件 url地址的问题就是小编分享给大家的全部内

  • 使用JavaScript解析URL的方法示例

    前言 在 Web 开发中,有许多情况需要解析 URL,这篇主要学习如何使用 URL 对象实现这一点.下面话不多说了,来一起看看详细的介绍吧 开始 创建一个以下内容的 HTML 文件,并在浏览器中打开. <html> <head> <title>JavaScript URL parsing</title> </head> <body> <script> // 激动人心的代码即将写在这里 </script> <

  • Python3直接爬取图片URL并保存示例

    有时候我们会需要从网络上爬取一些图片,来满足我们形形色色直至不可描述的需求. 一个典型的简单爬虫项目步骤包括两步:获取网页地址和提取保存数据. 这里是一个简单的从图片url收集图片的例子,可以成为一个小小的开始. 获取地址 这些图片的URL可能是连续变化的,如从001递增到099,这种情况可以在程序中将共同的前面部分截取,再在最后递增并字符串化后循环即可. 抑或是它们的URL都保存在某个文件中,这时可以读取到列表中: def getUrls(path): urls = [] with open(

  • Spring Security如何使用URL地址进行权限控制

    这篇文章主要介绍了Spring Security如何使用URL地址进行权限控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 目的是:系统内存在很多不同的用户,每个用户具有不同的资源访问权限,具体表现就是某个用户对于某个URL是无权限访问的.需要Spring Security忙我们过滤. FilterSecurityInterceptor是Spring Security进行URL权限判断的,FilterSecurityInterceptor又继

  • Maven镜像地址配置示例大全

    最近在准备项目架构时,虽然自己已经又了私服,通过私服进行仓库的管理,但是由于网速的限制原因,又想在项目环境迁移时可以快速的构建并启动或者快速更新,之前项目开发的工作中,使用了一个国外的一个仓库,拉取了一些坏的包,导致了一些异常,后来搞了好几天才解决掉(解决办法:当然是更换仓库镜像地址咯!!!),所以花费了些时间收集并整理了这些 maven镜像地址. Maven 镜像地址大全 1.阿里的镜像地址 <mirror>     <id>alimaven</id>     <

随机推荐