服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c#代码生成URL地址的示例

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

2022-11-11 14:13超然 C#

这篇文章主要介绍了c#代码生成URL地址的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

“头疼”

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

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

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

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

“吃药”

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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`,
  },
}

那么请求代码就可以改成

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

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

工具代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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;
    }
}

使用代码

?
1
2
3
#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地址的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/TimChen44/archive/2021/04/10/14642328.html

延伸 · 阅读

精彩推荐
  • C#C#简单遍历指定文件夹中所有文件的方法

    C#简单遍历指定文件夹中所有文件的方法

    这篇文章主要介绍了C#简单遍历指定文件夹中所有文件的方法,结合实例形式分析了文件夹与文件遍历的技巧,并附带说明了文件与文件夹操作的常用函数,需...

    芊芊4982021-11-29
  • C#C# 使用HttpClient模拟请求的案例

    C# 使用HttpClient模拟请求的案例

    这篇文章主要介绍了C# 使用HttpClient模拟请求的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    丨背水丨7972022-10-12
  • C#使用代理模式来进行C#设计模式开发的基础教程

    使用代理模式来进行C#设计模式开发的基础教程

    这篇文章主要介绍了使用代理模式来进行C#设计模式开发的基础教程,代理模式主张在客户端和目标对象中间建立中介来降低程序设计的耦合度,需要的朋友可...

    saville10862021-11-14
  • C#C#实现如何使用短信平台自动通知用户实例

    C#实现如何使用短信平台自动通知用户实例

    这篇文章主要介绍了C#实现如何使用短信平台自动通知用户实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    chunchunlaila9552022-08-28
  • C#WPF弹出带蒙板的消息框

    WPF弹出带蒙板的消息框

    这篇文章主要为大家详细介绍了WPF弹出带蒙板的消息框,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    普通的地球人9152021-12-16
  • C#C#中decimal保留2位有效小数的实现方法

    C#中decimal保留2位有效小数的实现方法

    这篇文章主要介绍了C#中decimal保留2位有效小数的实现方法,针对decimal变量保留2位有效小数有多种方法,可以使用Math.Round方法以及ToString先转换为字符串等操...

    低调码农哥!8792022-08-08
  • C#C# Winform 实现TCP发消息

    C# Winform 实现TCP发消息

    这篇文章主要介绍了C# Winform 实现TCP发消息的示例,帮助大家更好的理解和学习使用c#技术,感兴趣的朋友可以了解下...

    小草上飞飞3362022-11-08
  • C#C# 中属性PropertyInfo的setvalue用法说明

    C# 中属性PropertyInfo的setvalue用法说明

    这篇文章主要介绍了C# 中属性PropertyInfo的setvalue用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    锋璠10552022-10-29