手机版

@angular前端项目代码优化之构建美国石油学会(American Petroleum Institute)树的方法

时间:2021-08-28 来源:互联网 编辑:宝哥软件园 浏览:

前颜(颜)

在前端项目的开发过程中,往往后端会给到一份数据接口(本文简称api),为了减少后期的维护以及出错成本,我的考虑是希望能够找到这么一种方法,可以将所有的美国石油学会(美国石油协会)以某种方式统一的管理起来,并且很方便的进行维护,比如当后端修改了美国石油学会(美国石油协会)名,我可以很快的定位到该美国石油学会(美国石油协会)进行修改,或者当后端添加了新的api,我可以很快的知道具体是一个美国石油学会(美国石油协会)写漏了。

于是,我有了构建美国石油学会(American Petroleum Institute)树的想法。

一、前后端分离(Resful api)

在前后端分离的开发模式中,前后端的交互点主要在于各个数据接口,也就是说后端把每个功能封装成了api,供前端调用。

举个例子,假设后端提供了关于用户的以下3个api:

http(s):/XXX。com/API/v1/user/对应的美国石油学会(美国石油协会)描述如下(为了方便理解,这里只考虑得到请求):

一获取用户编号的用户数据2获取用户名为名字的用户信息3获取年龄为年龄的用户列表

二、在成分中调用美国石油学会(美国石油协会)接口获取数据

目前各大前端框架比如棱角分明以及反应等,都有提供相关HttpClient,用来发起超文本传送协议(超文本传输协议的缩写)请求,比如获取、发布、放置、删除等,由于本人比较熟悉棱角分明,下面代码以有角的进行举例(其他框架做法类似),代码统一使用以打字打的文件语法。

在app.component.ts中调用api:

从“@棱角分明/核心”导入{组件};从" @angular/common/http "导入{ Http客户端};@ Component({选择器: ' app-root ',模板Url: ' ./app.component.html ',style URL 3360[]./app。组件。SCS ']})导出类AppComponent { userInfo构造函数(私有http : HttpClient){ this。GetUserByID(1);} async GetUserByID(UserID){ const URL=` https://www。XXX。com/API/v1/user/$ { UserID } `;这个。UserInfo=等待这个。http。获取(网址).topcolorse();}}三、封装UserHttpService

在项目中,由于多个页面可能需要调用同一个api,为了减少代码的冗余以及方便维护,比较好的方式是将所有的美国石油学会(美国石油协会)封装到一个服务中,然后将这个服务实例化成单例模式,为所有的页面提供超文本传送协议(超文本传输协议的缩写)服务。

有角的提供了依赖注入的功能,可以将服务注入到组件中,并且在组件中的各个成分共享同一个服务,因此不需要手动去实现服务的单例模式。

代码如下:

user.http.service.ts

从“@棱角分明/核心”导入{内射};从" @angular/common/http "导入{ Http客户端};const HOST _ URL=`https://www.xxx.com/api/v1`;@可注射()导出类UserHttpService {构造函数(私有http : Http client){ } async GetUserByID(UserID){ const URL=` $ { HOST _ URL }/user/$ { UserID } `;返回this.http.get(url).topcolorse();} async GetUserBYNAmE(name){ const URL=` $ { HOST _ URL }/user/GetBYNAmE/$ { name } `;返回this.http.get(url).topcolorse();} async GetUserByage(age){ const URL=` $ { HOST _ URL }/user/GetByage/$ { age } `;返回this.http.get(url).topcolorse();}}app.component.ts

从“@棱角分明/核心”导入{组件};从""导入{ UserHttpService } ./user。http。“服务”;@ Component({选择器: ' app-root ',模板Url: ' ./app.component.html ',style URL 3360[]./app。组件。SCS ']})导出类AppComponent(构造函数(私有用户httpservice :用户httpservice){这。getuser byid(1);} async GetUserByID(UserID){ const UserInfo=等待此。UserHttpServiCe。GetUserBYID(用户标识);控制台。日志(UserInfo);}异步getUserByName(名称){ const UserInfo=等待这个。UserHttpServiCe。GetUserBYNAmE(名称);控制台。日志(UserInfo);} async GetUserByGage(age){ const UserInfoList=this wait。UserHttpServiCe。GetUserByGage(年龄);控制台。日志(用户信息列表);}}这样的好处在于:

1、团队合作:

前端项目可以分为HttpService层和Component层,由不同的人分别维护

2.减少代码冗余:

在多个组件中调用同一个api时,不需要编写多个代码

3.降低维护和扩展成本:

当后端添加或修改接口时,因为所有的用户api都在UserHttpService中,所以可以很容易地调整接口,而不会影响组件层的代码

但是,上述方案仍然有一个缺点,那就是url采用了字符串拼接的形式:

const URL=` $ { HOST _ URL }/user/getByName/$ { name } `;这容易出现以下问题:

1.接口名称拼接错误,而且因为是字符串拼接,所以不会有语法提示(ts)

2.没有完整的api表来映射后端,所以不容易排除问题。因此,本文的主题是:构建Api树。

第四,手动构建Api树

什么是Api树?我把它定义为把所有的API以节点的形式挂在一棵树上,最后形成一个包含所有API的树结构。

构建api树(手动构建)的最初想法如下:

/* * *手动构建API树*/const API树={ domain 1: { AP 3360 { v 1: { user 3360 { getbyname 3360 ' https://www.xxx.com/API/v1/user/getbyname', getByAge : ' https://www . XXX.com/API/v1/user/getByAge ' },animal : { getByType : ' 3https://www . XXX.com/API/v1/animal/getByType ',getByAge 333330导出{ APITREE };使用api树,我们可以通过以下方式从api树中提取每个api节点的url,代码如下:

//获取网址:https://www.xxx.com/api/v1/user/getByNameconst getby name网址=apitree . domain 1 . API . v1 . user . getby name;//在https://xxx.xxx.cn/api/car/api1const;获取网址:cara pi1 URL=api tree . domain 2 . API . car . API 1但是,上述构建API树的方法有两个缺点:

1.所有路径都需要在每个节点手动拼接

2.只能提取子节点的URL:getbyname和getByAge,不能提取父节点的URL。例如,如果我想获得https://www.xxx.com/api/v1/user,我不能通过APITREE.domain1.api.v1.user获得它

const Api Tree={ domain 1: { AP 3360 { v 1: }//用户是父节点//缺点1:无法通过Api Tree . domain 1 . Api . v1 . user user user 3360//缺点2:在getByName和getbyage节点中手动编写全路径串联getby name : ' https://www.xxx.com/API/v1/user/getbyname', getby gee 3360 ' https://www.xxx.com/API/v1/user/get v . Api Tree Generator(Api Tree Generator)

为了解决手动构建Api树的问题,我引入了两个概念:apiTreeConfig(基本配置)和apiTreeGenerator(生成器)。

apiTreeConfig由apiTreeGenerator处理,最终生成真正的apiTree。

1.apiTreeConfig我称之为基本配置。apiTreeConfig有一定的配置规则,要求每个节点名称(域名除外)必须与api url中的每个节点名称一致,因为apiTreeGenerator是根据apiTreeConfig的每个节点名称生成的,api树配置如下:

/* * * API tree config * _这个可以省略不写,但是如果不写,ts中就没有语法提示。*子节点getByName、getByAge和_this可以是任意值。因为它将由apiTreeGenerator */const apitreeconfig={ AP : { v 1: { user 3360 { getbyname 3360 ' ',getbyage3360 ' ',_ this:''}},_ this3360''}}重新分配;导出{ APITERENconfig };2.我称之为生成器的apiTreeGenerator具有以下功能:

1)遍历apiTreeConfig,处理apiTreeConfig的所有子节点,并根据该节点的所有父节点链生成一个完整的url,作为该节点的值,如apiTreeConfig . API . v1 . user . getByName-https://www . XXX.com/API/v1/user/getByName

2)遍历apiTreeConfig,处理apiTreeConfig的所有父节点,并在每个父节点中添加_this子节点指向父节点的完整url。

apiTreeGenerator(阿金)阿云:

(不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,贺盛瑞阿阿阿阿阿阿中养蜂人,菲奥纳维奥纳维奥纳养蜂人,你好。)

从导入{ APITREECONFIG } ./API-树。配置;const API tree=apitreeconfigconst host _ URL=` 339 www。XXX。com ';/**吾曰节点链美国石油学会(American Petroleum Institute)王振(电影)HOST_URL唉哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟*/const add host=(apinode chain 3330 string)={ return apinode chain?}?`$ { host _ URL }/$ { apinodechain。replace(/^ \//,')} ` : host _ url}:/**你好树配置美国石油学会(American Petroleum Institute)阿金树API:* @ param API tree config API tree config * @ param parapinodechain父节点1/父API node 2/父apinode 3 */const apitree生成器=(API tree config 3330 string | object,parentApiNodeChain?3330字符串)={ for(对象的常量键。keys(API tree config)){ const API node=key;const前缀链=父节点链?`$ { parent node chain }/` : ';if(object。原型。tostring。call)(apitree config[key])==[object]={ API tree生成器(API tree config[key],prefixChain API node):} else { API tree config[key]=parent API node chain?addhost(前缀链API tree config[key]): addhost(API tree config[key]);} //哼哼哼_这哎哎(贺盛瑞?贺盛瑞是吗哎哎哎)apitreconfig[' _ this ']=父apinodechain?add host(` $ { parent node chain } `): add host(' ');}:apitree生成器(API tree config);导出{ API tree };阿苏姆阿苏姆阿苏姆阿苏姆阿苏姆阿苏姆阿苏姆阿苏姆阿苏姆阿苏姆阿苏姆阿苏姆阿苏姆阿苏姆:

哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟UserHttpService(用户超文本传送协议(Hyper Text Transport Protocol的缩写)服务)绿筠小姐:user.http.service.ts

从“@棱角分明/核心”导入{可注射}:从" @angular/common/http "导入{ HttpClient }:从导入{ APITREE } ./api树;@ injectable()导出类userhttpservice {构造函数(专用http 3330 http client){ } async getuser byid(userid){ const URL=API tree。API。v1。用户。_ this '/' userid;返回此。http.get(url).topcolore();} async getuser by name(name){ const URL=API tree。API。v1。用户。get by name/' name;返回此。http.get(url).topcolore();} async getuser byage(age){ const URL=API tree。API。v1。用户。get by age '/' age;返回此。http.get(url).topcolore();}}菲儿~我爱你~乌斯

阿久蜜蜂树,我的天啊:

1 .{ 1 }我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊蜜蜂,蜜蜂,范文范文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文阿文APITREE.api.v1.user.getByName

2、apitreeconfig张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉?张曼玉原料药什么,凯末尔维尤

{ 1 }哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟空气污染指数哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟,apiTreeConfig嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨

-什么演示

吉卜赛人云娥:339 github。com/简单代码CX/我的域/树/主/角/API树

朱塞佩朱塞佩朱塞佩朱塞佩,阿云阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜,吴亚玲吴亚玲吴亚玲。

版权声明:@angular前端项目代码优化之构建美国石油学会(American Petroleum Institute)树的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。