#json-api #json #api

ciboulette

解析 JSON:API 请求并构建响应的库

5 个版本

0.1.4 2021 年 5 月 13 日
0.1.3 2021 年 5 月 13 日
0.1.2 2021 年 5 月 2 日
0.1.1 2021 年 4 月 29 日
0.1.0 2021 年 4 月 28 日

#39 in #json-api


2 crates 中使用

MIT/Apache

370KB
10K SLoC

Ciboulette

一个 JSON:API 库。

查看 文档


lib.rs:

简介

Ciboulette 是一个 JSON:API 库。

它允许用户解析请求并构建响应,同时遵守 JSON:API 规范

它旨在拥有较小的内存占用并快速。

组件的高级视图

从高层次来看,一个 API资源类型 构成。资源类型通过边表示它们之间的 关系 组织成图。

除了图之外,还使用一个邻接映射来有效地通过别名检索 资源类型。整个结构都保存在一个 存储 中。

资源类型

可以使用 资源类型构建器 构建资源类型。它由以下部分组成:

  • 一个名称,稍后将被用作别名来从存储的图检索 资源类型
  • 一个 id 类型,它将被用来反序列化请求中的 ids。
  • 一个 模式,它将被用来反序列化请求体和序列化响应。

关系选项

多对多

多对多 选项结构体 将资源 "A" 映射到另一个资源 "C" 通过另一个资源 "B"(桶)

    Resource A                      Resource B (bucket)                    Resource C
┌─────────────────┐  ┌─────────────────────────────────────────────┐  ┌─────────────────┐
│                 │  │                                             │  │                 │
│  peoples──►id───┼──┼──►people_id◄──people-article──►article_id◄──┼──┼──id◄──articles  │
│                 │  │                                             │  │                 │
└─────────────────┘  └─────────────────────────────────────────────┘  └─────────────────┘

在创建多对多关系(A <-> C)时,我们还将创建一个多对一关系,分别是 A -> BC -> BB -> AB -> C,这样我们就可以直接引用关系。

一对一/多对一

选项结构体将一个“多”资源映射到一个“一”资源。

                    Many table                                          One table
┌──────────────────────────────────────────────────┐  ┌──────────────────────────────────────┐
│                                                  │  │                                      │
│ many_table_element_0──────────►many_table_key_0──┼──┼──►one_table_id◄───one_table_element  │
│                                                  │  │     ▲      ▲                         │
│                                                  │  │     │      │                         │
│ many_table_element_1──────────►many_table_key_1──┼──┼─────┘      │                         │
│                                                  │  │            │                         │
│                                                  │  │            │                         │
│ many_table_element_2──────────►many_table_key_2──┼──┼────────────┘                         │
│                                                  │  │                                      │
│                                                  │  └──────────────────────────────────────┘
└──────────────────────────────────────────────────┘

在选项中,一个字段用于确定多对一/一对一关系是否是多对多关系的一部分。

请求

每个请求都可以归结为相同的基本组件。但也有一些特殊情况

  • 创建请求可以没有资源id,
  • 更新请求可以包含资源标识符的主体。

每个请求都必须首先使用请求构建器反序列化。然后它可以构建为一个通用的请求。从那里,可以根据意图将其转换为所需的请求类型。尝试将通用请求转换为不兼容的子类型将导致错误。正确的转换映射如下所示

意图 请求类型
创建 创建请求
读取 读取请求
更新 更新请求
删除 删除请求

每个请求的子类型都实现了一个通用特质,以允许泛型化。

响应

响应是由请求和一系列响应元素构建的。

根据请求,响应将构建为正确的格式。

响应元素

每个响应应该有一个单一的主要资源类型

以下是对主要资源类型中元素部分进行响应元素组成的说明

响应元素字段 始终需要 描述
类型 当前元素的资源类型
标识符 当前元素的资源标识符
数据 资源的JSON数据(如果有的话)
related.rel_chain
(仅用于相关数据)
从主要资源类型的关联元数据链
related.element
(仅用于相关数据)
与它相关联的元素的资源标识符

依赖性

~6–11MB
~243K SLoC