框架为编程提供了不同的体验,例如基于 MVC 架构(数据模型、用户视图,以及其间通讯的控制器)的框架大大降低了程序的移植、维护、扩展和重用的成本;Express 为开发者提供了快速、独立、极简的 Web 应用开发框架,使用者可以基于此很快实现 Web 应用。Sails 框架可以基于 Express 提供比 Express 更多的开箱即用的全栈功能,比如身份验证、ORM、WebSockets 和 EJS 模板,它的 Blueprints API 生成器允许你使用最少的手动编码生成 API 端点。而 Meteor 框架比 Express 或 Sails 更有主见,它使用在线数据而不是服务器端渲染,且支持热重载。
Web、Android 或 iOS 设备与微服务的所有交互都需要通过 API 进行。因此 API 的设计在为这些接口提供数据方面发挥着重要作用。这意味着微服务只有一种通信媒介,即 API。
因此在为我们的微服务/后端服务编写实现之前,需要首先考虑我们的 API 的优先设计。API 是业务驱动程序,因此在系统开发之初就开发它。
API 优先方法的好处:
- 可重用/可组合
- 企业 允许并行开发
- 在项目的整个生命周期内降低总成本。
- 降低故障风险
- 更快的增长
- 不受约束
你可能会使用一个简单的 REST API 框架来处理对服务器的 CRUD 请求。使用 Express 几乎可以做到这一点。
- GET 请求:用于获得对资源的只读访问权限。
- POST 请求:用于创建或插入新资源。
- PUT 请求:用于更新现有资源。
- DELETE 请求:用于删除现有资源。
RESTful 架构风格描述了六个指导约束。
- 统一的界面:它简化并解耦了架构,并使系统的每个部分独立。它使用 URI 来识别资源。每个资源在概念上都与返回给客户端的表示分离。服务器定义传输模型的类型。
- 无状态:服务器不保留会话信息,这使其成为大容量应用程序的理想选择;同时无状态提高了性能。
- 可缓存性:可以提供陈旧或不适当的数据以响应进一步的请求,以提高性能和可扩展性。
- 客户端-服务器:根据分离规则,该设计强制执行的关注点将用户界面与数据存储区分开来。
- 分层系统:客户端通常无法判断它是直接连接到终端服务器还是连接到中间服务器。如果在客户端和服务器之间放置代理服务器或负载平衡器,则不会中断它们的通信。中间服务器可以通过启用负载平衡和提供共享缓存来提高系统可伸缩性。
- 按需代码(可选):服务器可以通过传输可执行代码临时扩展或定制客户端的功能。
Express
快速、无偏见、极简的 Node 框架。只提供你需要的东西。该框架本身提供的功能很少,而不是允许广泛的中间件链来处理请求。
由于其健壮性,许多流行的框架(如 Feathers、Kraken、Sails、Kites、NestJs 等)都基于 Express。
它是一个最小且灵活的基于 node.js 的 Web 应用程序框架,可为 Web 和移动应用程序提供一组强大的功能。
由于它在 node.js 之上提供了一个层,我们可以高效地访问 JavaScript 函数。它适用于编写具有服务器渲染的应用程序,因为它支持许多模板引擎(例如 pug 和 handlebars)。对于 API 开发,它包含中间处理程序和许多 HTTP 服务/实用程序方法。
在我们使用 REST API 框架来处理对服务器的 CRUD 请求时,Express 虽然也可以做到,但也有专门用于处理这种特殊情况的框架。
Loopback(推荐)
Loopback 是 github 上非常受欢迎的开源 Node.js REST API 框架,它基于 Express 高度扩展,可以让你快速创建动态 API 和微服务。LoopBack 4 是下一代 LoopBack。
基于 Express 的高度可扩展的开源 Node 和 TypeScript 框架,可让你快速创建后端系统(例如数据库和 SOAP 或 REST 服务)组成的 API 和微服务。
它是一种新的、改进的编程模型,具有依赖注入和组件、混合、存储库等新概念,使其具有最大的可扩展性。 LoopBack 允许我们使用 OpenAPI-to-GraphQL 为任何 REST API 创建一个 GraphQL 接口。
它带有一个命令行工具,用于轻松生成项目和创建控制器和模型,并提供附加支持以轻松进行身份验证和授权。它不为视图或模板或专用 ORM 提供任何支持,因为它仅用作 API。
Loopback 允许你在几分钟内以最少的编码创建动态 API。开发周期非常快,文件结构干净实用。设置包括开箱即用的配置 eslint、prettier、mocha 和 docker 的选项。许多公司正在广泛使用 LoopBack。
使用 LoopBack 4 创建一个 REST API 应用。使用日志:
$ npm list -g --depth=0
/usr/local/lib
├── @popperjs/core@2.11.5
├── async@3.2.0
├── bcrypt@5.0.0
├── body-parser@1.19.0
├── bootstrap@5.1.3
├── express-generator@4.16.1
├── express-session@1.17.0
├── gulp-cli@2.3.0
├── hexo-cli@4.2.0
├── http-server@0.12.3
├── jade@1.11.0
├── jquery@3.6.0
├── jsdom@16.2.2
├── n@6.5.1
├── nodemon@2.0.3
├── npm@6.14.5
├── openapi-types@11.0.1
├── province-city-china@6.0.3
├── pug@2.0.4
├── sails@1.5.2
├── sass@1.26.10
└── uuid@7.0.3
# 安装 loopback 4
$ npm install -g @loopback/cli
+ @loopback/cli@4.0.0
added 68 packages from 22 contributors, removed 47 packages, updated 139 packages and moved 2 packages in 155.869s
# 对 node 升级一下
$ npm install -g n
/usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n
+ n@8.2.0
updated 1 package in 2.268s
$ sudo n stable
Password:
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to nodejs.org:443
Error: failed to download version index (https://nodejs.org/dist/index.tab)
#断开 VPN 再试一次
$ sudo n stable
installing : node-v16.15.0
mkdir : /usr/local/n/versions/node/16.15.0
fetch : https://nodejs.org/dist/v16.15.0/node-v16.15.0-darwin-x64.tar.xz
copying : node/16.15.0
installed : v16.15.0 (with npm 8.5.5)
# 创建一个 chaos 的应用
$ lb4 app
? Project name: chaos
? Project description: A chaos API made with LoopBack 4.
? Project root directory: (chaos)
? Application class name: (chaos)
? Select features to enable in the project:
❯◉ Enable eslint: add a linter with pre-configured lint rules
◉ Enable prettier: install prettier to format code conforming to rules
◉ Enable mocha: install mocha to run tests
◉ Enable loopbackBuild: use @loopback/build helpers (e.g. lb-eslint)
◉ Enable vscode: add VSCode config files
◉ Enable docker: include Dockerfile and .dockerignore
◉ Enable repositories: include repository imports and RepositoryMixin
◉ Enable services: include service-proxy imports and ServiceMixin
Application chaoswas created in chaos.
# 文件结构
src/
__tests__/
acceptance/
home-page.acceptance.ts
ping.controller.acceptance.ts
test-helper.ts
README.md
controllers/
index.ts
ping.controller.ts
README.md
datasources/
README.md
models/
README.md
repositories/
README.md
application.ts
index.ts
migrate.ts
sequence.ts
public/
index.html
node_modules/
***
LICENSE
README.md
DEVELOPING.md
index.js
index.ts
package.json
tsconfig.json
tsconfig.tsbuildinfo
搭建 LoopBack 4 应用程序的过程分为:
- 创建应用模型
- 定义存储数据的数据源
- 添加存储库以绑定模型和数据源
- 添加控制器以公开 REST API
- chaos 应用概述
接下来我们来搭建 LoopBack 4 应用程序。
1)创建 chaos 应用模型。
模型描述业务领域对象并定义具有名称、类型和其他约束的属性列表。模型既用作数据传输对象 (DTO),用于表示请求中传入的实例,也用作与 loopback-datasource-juggler 一起使用的数据结构。
按照 CLI 提示进行操作。
? Model class name: chaos
? Please select the model base class: Entity (A persisted model with an ID)
? Allow additional (free-form) properties? No
Let's add a property to chaos
Enter an empty property name when done
? Enter the property name: id
? Property type: number
? Is id the ID property? Yes
? Is it required?: No
? Is id generated automatically? Yes
? Default value [leave blank for none]:
Let's add another property to chaos
Enter an empty property name when done
? Enter the property name: title
? Property type: string
? Is it required?: Yes
? Default value [leave blank for none]:
Let's add another property to chaos
Enter an empty property name when done
? Enter the property name: desc
? Property type: string
? Is it required?: No
? Default value [leave blank for none]:
Let's add another property to chaos
Enter an empty property name when done
? Enter the property name: isComplete
? Property type: boolean
? Is it required?: No
? Default value [leave blank for none]:
Let's add another property to chaos
Enter an empty property name when done
? Enter the property name:
create src/models/chaos.model.ts
update src/models/index.ts
Model chaos was created in src/models/
2)添加数据源。
LoopBack 使用数据源连接到各种数据,例如数据库、API、消息队列等。
LoopBack 4 中的数据源是连接器实例的命名配置,它表示外部系统中的数据。 legacy-juggler-bridge 使用该连接器来启动 LoopBack 4 存储库以进行数据操作。
有关 LoopBack 中数据源的更多信息,请参阅数据源。
在项目文件夹中,运行 lb4 datasource 命令以创建数据源。为简单起见,我们使用内存数据库,将数据保存在本地文件系统中。
? Datasource name: db
? Select the connector for db: In-memory db (supported by StrongLoop)
? window.localStorage key to use for persistence (browser only):
? Full path to file for persistence (server only): ./data/db.json
create src/datasources/db.datasource.json
create src/datasources/db.datasource.ts
update src/datasources/index.ts
Datasource db was created in src/datasources/
数据源 db 在 src/datasources/ 中创建。
由于我们已指定文件 ./data/db.json 来保存内存中连接器的数据,让我们从项目的根目录创建目录和文件,并使用你喜欢的编辑器(例如 vim)添加如下所示的值.
$ touch data/db.json
在 data/db.json 文件中,复制并粘贴下面的 JSON 为你的模型提供一些数据:
"models": {
"Chaos": {
"1": "{\"title\":\"Take over the galaxy\",\"desc\":\"MWAHAHAHAHAHAHAHAHAHAHAHAHAMWAHAHAHAHAHAHAHAHAHAHAHAHA\",\"id\":1}",
"2": "{\"title\":\"destroy alderaan\",\"desc\":\"Make sure there are no survivors left!\",\"id\":2}",
"3": "{\"title\":\"play space invaders\",\"desc\":\"Become the very best!\",\"id\":3}",
"4": "{\"title\":\"crush rebel scum\",\"desc\":\"Every.Last.One.\",\"id\":4}"
}
}
}
现在你已经添加了数据源,让我们继续为数据源添加存储库。
3)添加存储库。
存储库表示一个专门的服务接口,它针对底层数据库或服务提供域模型的强类型数据访问(例如,CRUD)操作。
在项目文件夹中,运行 lb4 repository 命令以使用上一步中的 db 数据源为你的模型创建一个存储库。 db 数据源通过其类名 DbDataSource 从可用数据源列表中显示。
? Please select the datasource DbDatasource
? Select the model(s) you want to generate a repository chaos
? Please select the repository base class DefaultCrudRepository (Legacy juggler bridge)
create src/repositories/chaos.repository.ts
update src/repositories/index.ts
存储库 ChaosRepository 创建于 src/repositories/。
src/repositories/index.ts 文件使导出工件成为中心,也更容易导入。
新创建的 chaos.repository.ts 类具有为我们的模型执行 CRUD 操作所需的必要连接。
它利用模型定义和 “db” 数据源配置,并使用依赖注入检索数据源。
接下来,我们需要构建一个控制器来处理我们的传入请求。
4)添加控制器。
在 LoopBack 4 中,控制器处理 API 的请求-响应生命周期。
控制器上的每个功能都可以单独处理以处理传入请求(如对 /chaos 的 POST 请求),执行业务逻辑并返回响应。在这方面,控制器是你的大部分业务逻辑所在的区域!
你可以使用 CLI 创建 REST 控制器,如下所示:
? Controller class name: chaos
Controller Chaos will be created in src/controllers/chaos.controller.ts
? What kind of controller would you like to generate? REST Controller with CRUD functions
? What is the name of the model to use with this CRUD repository? Chaos
? What is the name of your CRUD repository? ChaosRepository
? What is the name of ID property? id
? What is the type of your ID? number
? Is the id omitted when creating a new instance? Yes
? What is the base HTTP path name of the CRUD operations? /chaos
create src/controllers/chaos.controller.ts
update src/controllers/index.ts
Controller Chaos was created in src/controllers/
控制器 chaos 是在 src/controllers/ 中创建的。
应用程序已准备好运行。
在此之前,让我们回顾一下位于 src/controllers/chaos.controller.ts 中的 ChaosController 中的代码。此示例使用两个新装饰器为 LoopBack 提供有关传入请求正文的路由、动词和格式的元数据:
@post('/chaos') 为 @loopback/rest 创建元数据,以便在路径和动词匹配时将请求重定向到此函数。
@requestBody() 将 Chaos 的 OpenAPI 模式与请求正文相关联,以便 LoopBack 可以验证传入请求的格式。
我们还添加了自己的验证逻辑,以确保如果用户未能在其 POST 请求中提供标题属性,他们将收到错误消息。
现在我们已经连接了控制器,最后一步是将其全部绑定到应用程序中!
5)把它们放在一起。
让我们试试我们的应用程序吧! 首先,你需要启动应用程序。
Server is running at http://127.0.0.1:3000
Try http://127.0.0.1:3000/ping
接下来,你可以使用 API Explorer 浏览你的 API 并发出请求!以下是你可以尝试的一些请求:
POST /chaos 正文为 { "title": "buy milk" }。使用从 POST 收到的 ID 获取 /chaos/{id},并查看是否找回了 Chaos 对象。
PATCH /chaos/{id} 使用相同的 ID,正文为 { "desc": "need milk for grain" }。
GET /chaos/{id} 使用前面步骤中的 ID 查看更改是否已保留。
就是这样! 你刚刚创建了一个 LoopBack 4 应用程序。
相关推荐
Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API...
4. 最后,我们需要测试Restful API和WebService API接口,确保其正常工作。 结论: 本实验展示了如何使用SpringBoot、Mybatis和CXF框架来实现Restful API和WebService API接口的大实验。通过本实验,我们可以学习...
restful api访问k8s集群,增删改查信息。 需要预先创建访问权限的配置。 官网api文档 https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/ 下面罗列部分api curl -u admin:admin ...
Python Flask高级编程之RESTFul API前后端分离精讲Python Flask高级编程之RESTFul API前后端分离精讲Python Flask高级编程之RESTFul API前后端分离精讲Python Flask高级编程之RESTFul API前后端分离精讲Python Flask...
thinkphp6 RESTful API开发 开发过程记录笔记 https://blog.csdn.net/weixin_41120504/article/details/115638094
Python Flask高级编程之RESTFul API前后端分离精讲第二章节Python Flask高级编程之RESTFul API前后端分离精讲第二章节Python Flask高级编程之RESTFul API前后端分离精讲第二章节Python Flask高级编程之RESTFul API...
4. **路由和处理逻辑**:根据请求的URL和HTTP方法,确定应执行的操作,这可以看作是RESTful API的路由。比如,GET /users/:id 可能对应获取用户信息的API。 5. **生成HTTP响应**:根据处理结果,生成HTTP响应,包括...
### RESTful API设计规范详解 #### 一、RESTful简介 RESTful是一种广泛应用于Web服务的设计风格,全称为Representational State Transfer(表述性状态转移)。它并非一项具体的技术标准,而是一系列设计原则和约束...
### RESTful API 接口说明 #### 一、RESTful API 概述 RESTful(Representational State Transfer)API 是一种构建网络应用和服务的标准方法,它遵循特定的约束条件和原则,利用HTTP协议来实现客户端与服务器之间...
本项目提供了一个RestfulApi服务端的示例,帮助开发者了解如何构建这样的服务。 在RestfulApi服务端的实现中,通常会用到以下技术栈: 1. **服务器框架**:如Spring Boot或Express.js,它们为快速构建RESTful API...
AdeptJ运行时RESTful API,MicroServices和WebApp的高性能,动态,模块化运行时。建立在高性能 Web服务器。 框架R8(以Apache 为实现)。模块:依赖注入(OSGi声明式服务)。带有JWT支持的JAX-RS 2.1(RESTEasy v...
**RestFul API 知识点详解** REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,以数据为中心,强调资源的状态转移。RESTful API是遵循REST原则设计的Web服务接口,...
**Spring Boot RESTful API Demo** 在现代Web开发中,RESTful API已经成为构建可扩展、松耦合服务的主要方式。Spring Boot作为Java生态系统中的一个强大框架,简化了创建生产级的基于Spring的应用程序。本示例将...
在当今信息技术飞速发展的时代,RESTful API已经成为构建互联网应用的基础。RESTful API提供了一种简单、高效、与语言无关的方法来构建Web服务。Python作为一种广泛使用的高级编程语言,以其简洁明了的语法、丰富的...
"Java调用Restful API接口的方式" Java调用Restful API接口是Java开发中非常重要的一部分,了解Java调用Restful API接口的方式可以帮助开发者更好地理解和使用相关技术。本文将详细介绍Java调用Restful API接口的...
OPCDA转restfulAPI,opcDA与mes或其它第三方通讯服务 x86
### RESTful API 设计最佳实践 #### 一、引言 随着互联网技术的发展,Web 应用变得越来越复杂,为了支持这些应用的功能扩展和服务交互,API 的设计变得尤为重要。RESTful API 是一种基于 HTTP 协议的应用程序编程...
Spring Boot 整合 Mybatis 实现RESTful API ,具体可以查看博客: http://blog.csdn.net/yaozhiqi1905658804/article/details/70820892
【标题】"lighttpd RESTful API与CGI的整合" 在Web开发中,轻量级HTTP服务器(如lighttpd)因其高效、低资源占用而受到青睐,尤其适合小型和中型项目。RESTful API设计模式是现代Web服务的重要组成部分,它允许通过...