在使用REST API时,命名空间的重要性(比较REST和GraphQL之类的)
在一篇名为「使用Rails来创建超简单API」的Qiita文章中,当我在学习API时,遇到了名字空间的概念,于是我进行了总结。
Namespace(名字空间)是什么?
命名空间是为了防止名称冲突而整理图层的概念。使用命名空间,即使名称相同,只要命名空间不同,就不会发生冲突。命名空间类似于姓氏,在有两个名字相同的人(比如太郎)的情况下,由于姓氏不同,例如山田太郎和上田太郎,可以避免概念上的冲突。在代码中如下所示的表示方式。
namespace YAMADA
{
name = "Taro"
}
namespace UEDA
{
name = "Taro"
}
put YAMADA::name
=> Taro
put UEDA::name
=> Taro
最终的输出结果是相同的,但从输出的Taro定义元中可以看出,它们来自于不同的地方A和B进行引用。此外,如果从不同的命名空间调用内容,则需要明确指明来源的位置。
REST API与GraphQL的特点和区别
REST API是什么
在调用程序时,遵循以下原则之一的约定。
-
- 为了能够抵御访问集中,实现无状态管理。
-
- 预先定义命令系统(如HTTP的GET和POST方法)。
-
- 用URL和方法来表示资源。
- 可以在信息内部包含多个链接到其他信息的能力。
GraphQL是一种数据查询和操作语言。
Facebook社开发的WebAPI规范,被Github、Netflix、Airbnb等公司采用,因此而闻名。由”查询语言”和”模式语言”组成。
在查询语言中,有以下3种类型:
1. 数据获取查询
2. 数据更新变更
3. 用于服务器端事件通知的订阅
Schema语言是一种用于描述GraphQL规范的语言。我们可以像下面这样定义查询的类型。
type Query {
currentUser: User!
}
type User {
id: ID!
name: String!
}
当对如上所示的架构进行下列所示的查询时,将以JSON格式返回内容。
query GetCurrentUser {
currentUser {
id
name
}
}
以下是GraphQL的主要特点,大致分为三个:
1. 查询和响应结构相似(通过在GraphQL中仅指定所需字段,可以轻松减小响应体的大小)
2. 以模式为中心的思想
3. 单一端点
REST API和GraphQL的比较
端点的数量
在REST中,存在多个终点,而GraphQL的特点是只有一个终点。在REST中,可以通过URL指定终点来明确资源。而GraphQL只有一个终点存在,比如(“POST /graphql”),欲获取的资源需要写在请求的正文中。
URI和HTTPS结构的使用方式
在REST中,我们通过URI或HTTPS来明确访问目标,而在GraphQL中,我们通过查询语言和模式语言来明确访问内容。
访问次数的限制
在REST中,由于考虑到减轻服务器负荷,经常会限制每小时的访问次数。而在GraphQL中,没有这样的限制。因此,需要自行进行负载计算。
在REST API中,设置命名空间是重要的原因。
为了使API URI的设置更加清晰明了,由于REST具有多个终端点,可以设置命名空间。同时,为了统一Namespace的结构,还需要调整目录的结构。
Rails.application.routes.draw do
namespace 'api' do
namespace 'v1' do
resources :posts
end
end
end
如果创建这样的命名空间结构,可以设置下面的目录结构。
---- controllers
--- api
-- v1
- posts_controller.rb
顺便说一下,即使不使用命名空间,也可以通过范围来进行设置。
【Ruby on Rails】路由的范围和命名空间之间的区别。