# 🦀 CrabVault API 文档
欢迎使用 CrabVault API!🗄️ 这是一个简洁、高效且类似 S3 的对象存储服务 API。
您将通过操作存储桶(Bucket)和对象(Object)的 URL 来管理它们的数据和元数据,它们的生命周期是绑定在一起的。
## 📖 基本概念
### 📍 API 入口点
所有 API 的基础 URL 是:
```
http://your-server-address:32767
```
### 🔐 认证
详见[配置文件](./配置文件.md)的 `server.auth` 块
### 📝 自定义元数据
我们支持两种元数据:
1. **系统元数据**: 使用标准的 HTTP 头部,例如 `Content-Type`, `ETag` 等。
2. **用户元数据**: 您可以通过添加 `X-Crab-Vault-User-Meta` 自定义请求头来存储您自己的键值对信息。
* 例如:`X-Crab-Vault-User-Meta:{"position":"Chongqing China","shot_on":"International Labour Day"}`。
* 注意:这个头部的值必须为 **BASE64_STANDARD** 编码的 utf-8 字符串,<u>往后的实例为了可读性,我们都使用未编码的原始数据</u>
* 同时为了方便,您传递或者我返回时,这个用户自定义信息均位于 `X-Crab-Vault-User-Meta` 头部。
* 在响应中,这些元数据也会以相同的头部格式返回。
* 默认情况下,如果不指定头部,我们将把 `X-Crab-Vault-User-Meta` 设置为空的对象
### ❌ 错误处理
如果请求出错,服务器会返回一个标准的 HTTP 错误状态码,响应体通常是一个包含错误信息的 JSON 对象,如:
```json
{
"objectMetaNotFound": {
"bucket": "sylvan",
"object": "somefile"
}
}
```
---
## 🪣 存储桶 (Bucket) 操作
存储桶是存放对象的容器。
### 1. 创建存储桶 (Create a Bucket)
创建一个新的存储桶来存放您的对象。此操作是幂等的。
* **Endpoint**: `PUT /{bucket_name}`
* **描述**: 如果存储桶不存在,则创建它。如果已存在,此操作不会产生任何影响。
* **路径参数**:
* `bucket_name` (string, required): 您想要创建的存储桶的名称。
* **请求头** (可选): `X-Crab-Vault-User-Meta`。
* **成功响应**:
* `201 Created`: 存储桶被成功创建。
* **cURL 示例**:
```bash
curl -X PUT http://localhost:3000/my-awesome-bucket \
-H "Content-Type: application/json" \
-H "X-Crab-Vault-User-Meta: {\"project\":\"Project Phoenix\"}"
```
### 2. 删除存储桶 (Delete a Bucket)
删除一个空的存储桶。
* **Endpoint**: `DELETE /{bucket_name}`
* **描述**: 只有当存储桶中没有任何对象时,才能成功删除。
* **成功响应**:
* `204 No Content`: 存储桶被成功删除。
* **错误响应**:
* `409 Conflict`: 如果存储桶不为空。
* `404 Not Found`: 如果存储桶不存在。
* **cURL 示例**:
```bash
curl -X DELETE http://localhost:32767/my-awesome-bucket
```
---
## 📄 对象 (Object) 操作
对象是您存储在 CrabVault 中的基本数据单元。
### 1. 📤 上传/更新对象 (Upload/Update an Object)
上传一个新对象,或者用新数据完全替换一个已有的对象。
* **Endpoint**: `PUT /{bucket_name}/{*object_name}`
* **描述**: 将请求体中的数据作为对象内容进行存储,并从请求头中提取元数据。
* **路径参数**:
* `bucket_name` (string, required): 对象所在的存储桶。
* `object_name` (string, required): 对象的完整路径名,例如 `images/avatars/user123.jpg`。
* **请求头**:
* `Content-Type` (string, required): 对象的 MIME 类型。
* `X-Crab-Vault-User-Meta` (string, optional): JSON 形式的用户自定义元数据。
* **请求体**: 对象的原始二进制数据。
* **成功响应**:
* `201 Created`: 对象被成功创建或更新。
* **cURL 示例**:
```bash
curl -X PUT http://localhost:3000/my-awesome-bucket/photos/paris.jpg \
-H "Content-Type: image/jpeg" \
-H "X-Crab-Vault-User-Meta: {"name":\"John Doe\"}" \
--data-binary "@path/to/your/local/image.jpg"
```
### 2. 📥 下载对象 (Download an Object)
获取一个对象的完整数据和其所有元数据。
* **Endpoint**: `GET /{bucket_name}/{*object_name}`
* **描述**: 返回对象的元数据(在响应头中)和数据(在响应体中)。
* **成功响应**:
* `200 OK`: 成功获取对象。响应头包含所有元数据,响应体是对象的数据。
* **cURL 示例**:
```bash
curl -v http://localhost:3000/my-awesome-bucket/photos/paris.jpg -o downloaded_paris.jpg
```
您将在终端输出中看到类似 `ETag`, `Content-Type`, `X-Crab-Vault-User-Meta` 等响应头。
### 3. 🔎 获取对象元数据 (Get Object Metadata)
仅获取一个对象的元数据,不下载其数据。非常适合用于检查对象状态。
* **Endpoint**: `HEAD /{bucket_name}/{*object_name}`
* **描述**: 和 `GET` 请求完全相同,但服务器 **不会** 返回响应体。
* **成功响应**:
* `200 OK`: 响应头中包含了对象的全部元数据。
* **cURL 示例**:
```bash
curl -I http://localhost:3000/my-awesome-bucket/photos/paris.jpg
```
### 4. ✏️ 更新对象元数据 (Update Object Metadata)
在不重新上传整个对象数据的情况下,修改一个对象的 **用户元数据**。
* **Endpoint**: `PATCH /{bucket_name}/{*object_name}`
* **描述**: 请求体中的 JSON 对象将被合并到现有的用户元数据中。已有的键将被更新,新的键将被添加,如果想删除旧的键,请将对应的值置为空
* **请求体**: 无。
* **成功响应**:
* `200 OK`: 元数据更新成功。
* **cURL 示例**:
```bash
curl -X PATCH http://localhost:3000/my-awesome-bucket/photos/paris.jpg \
-H "Content-Type: application/json" \
-H "X-Crab-Vault-User-Meta: {\"reviewed\":true,\"location\":\"Eiffel Tower\"}"
"
```
### 5. 🗑️ 删除对象 (Delete an Object)
从存储桶中永久删除一个对象及其所有元数据。
* **Endpoint**: `DELETE /{bucket_name}/{*object_name}`
* **描述**: 此操作是幂等的。删除一个不存在的对象也会返回成功。
* **成功响应**:
* `204 No Content`: 对象被成功删除或本来就不存在。
* **cURL 示例**:
```bash
curl -X DELETE http://localhost:3000/my-awesome-bucket/photos/paris.jpg
```
---
## 🦌 列表操作
### 1. 获取所有桶的元数据 (List All Buckets Metadata)
获取所有桶的元数据
- **Endpoint**:`GET /`
- **描述**:此操作会将所有桶的元数据下载下来,以 JSON 列表的形式
- 成功响应:
- `200 OK`:剩余的元数据会放在响应体中
- **cURL示例**
```bash
curl -v http://localhost:32767
```
- **响应示例(头部的 X-Crab-Vault-User-Meta)**
```json
[
{
"meta": {
"name": "some",
"created-at": "2025-08-20T05:02:40.777065800Z",
"updated-at": "2025-08-20T05:02:40.777068400Z",
"user-meta": {}
}
},
{
"meta": {
"name": "sylvan",
"created-at": "2025-08-20T05:02:47.129737Z",
"updated-at": "2025-08-20T05:02:47.129739800Z",
"user-meta": {}
}
}
]
```
### 2. 获取某一个桶内所有对象的元数据
### 1. 获取所有桶的元数据 (List All Buckets Metadata)
获取所有桶的元数据
- **Endpoint**:`GET /{bucket_name}`
- **描述**:此操作会将指定桶内所有对象的元数据下载下来,以 JSON 列表的形式
- **成功响应**:
- `200 OK`:剩余的元数据会放在响应体中
- **cURL示例**
```bash
curl -v http://localhost:32767/sylvan
```
- **响应示例(头部的 X-Crab-Vault-User-Meta)**
```json
[
{
"object-name": "anotherfile.json",
"bucket-name": "sylvan",
"size": 22,
"content-type": "application/json",
"etag": "S9rLr0zoRYiZQquJ+Zcw1jRIp9gVItI55ZFhEpMExwk",
"created-at": "2025-08-20T05:08:23.789410600Z",
"updated-at": "2025-08-20T05:08:23.789411100Z",
"user-meta": {
"user": "alex"
}
},
{
"object-name": "somefile.json",
"bucket-name": "sylvan",
"size": 22,
"content-type": "application/json",
"etag": "S9rLr0zoRYiZQquJ+Zcw1jRIp9gVItI55ZFhEpMExwk",
"created-at": "2025-08-20T05:02:13.464651600Z",
"updated-at": "2025-08-20T05:02:13.464652600Z",
"user-meta": {
"user": "sylvan"
}
}
]
```
---