API¶
通用错误¶
一些错误是所有 API 都可能会返回的。 具体说来,每个 API 都可能返回如下错误之一:
404 Not Found
{
"code": 1000,
"info": "NOT_FOUND",
"data": {}
}
401 Unauthorized
{
"code": 1001,
"info": "UNAUTHORIZED",
"data": {}
}
服务器内部错误。
500 Internal Server Error
{
"code": 1003,
"info": "INTERNAL_ERROR",
"data": {}
}
解析 JSON 请求体时缺少必要参数或出现错误。
400 Bad Request
{
"code": 1005,
"info": "INVALID_FORMAT",
"data": {}
}
USER 管理相关 /user¶
POST /register¶
注册一个用户。
请求正文样例:
{
"user_name": "Alice",
"password": "Hashed_Word",
"salt": "secret_salt",
"mail": "mymail@163.com"
}
正文的 JSON 包含一个字典,字典的各字段含义如下:
字段 | 类型 | 必选 | 含义 |
---|---|---|---|
user_name |
字符串 | 是 | 用户名 |
password |
字符串 | 是 | 用户密码 |
salt |
字符串 | 是 | 用户 salt |
mail |
字符串 | 是 | 用户邮箱 |
前端将用户名、加密后的密码与盐值传输到后端。
后端接受请求后,首先验证用户名是否重复、合法。
若用户名与密码都合法,则向所给邮箱发送一封邮件,并创建一个待验证用户对象等待邮件校验;否则返回错误信息。
-
成功发送校验邮件
成功发送用户注册校验邮件,则返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
用户名重复或用户名待验证
400 Bad Request
{ "code": 1, "info": "USER_NAME_CONFLICT", "data": {} }
-
用户名格式非法
400 Bad Request
{ "code": 2, "info": "INVALID_USER_NAME_FORMAT", "data": {} }
-
密码格式不合法
400 Bad Request
{ "code": 3, "info": "INVALID_PASSWORD_FORMAT", "data": {} }
POST /salt¶
返回一个用户注册时的 salt。
请求正文样例:
{
"user_name": "Alice"
}
各字段含义如下:
字段 | 类型 | 必选 | 含义 |
---|---|---|---|
user_name |
字符串 | 是 | 用户名 |
后端接受请求后,首先验证用户名是否合法,合法则返回用户 salt。
-
成功返回 salt
成功返回 salt,则返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "salt": "SECRET_SALT" } }
各字段含义如下:
字段 类型 必选 含义 salt
字符串 是 用户 salt
-
用户名或密码错误
400 Bad Request
{ "code": 4, "info": "USER_NAME_NOT_EXISTS_OR_WRONG_PASSWORD", "data": {} }
GET /verify/[token]¶
校验一个注册的用户。
无需请求正文。
后端检验 token 对应的待验证用户是否存在、未验证且处在待验证时间内。
满足这三个条件,则注册用户、将密码进行哈希后存储并返回登录 Token,否则返回错误信息。
-
成功校验用户
成功校验用户,返回如下响应并转入已登录状态:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "id": 1, "user_name": "Alice", "token": "SECRET_TOKEN" } }
-
验证用户名不存在
400 Bad Request
{ "code": 15, "info": "INVALID_TOKEN", "data": {} }
-
用户已经验证
400 Bad Request
{ "code": 16, "info": "ALREADY_VERIFIED", "data": {} }
-
长时间未验证需重新注册
400 Bad Request
{ "code": 17, "info": "TOO_LONG_TIME", "data": {} }
POST /login¶
用户登录。
请求正文样例:
{
"user_name": "Alice",
"password": "Bob19937"
}
各字段含义如下:
字段 | 类型 | 必选 | 含义 |
---|---|---|---|
user_name |
字符串 | 是 | 用户名 |
password |
字符串 | 是 | 用户密码 |
后端接受请求后,验证用户是否存在,若是则验证密码与存储的密码哈希值是否匹配。
二者都通过则成功登录并返回 token,否则返回用户名或密码错误。
-
成功登录
返回如下响应并转入已登录状态:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "id": 1, "user_name": "Alice", "token": "SECRET_TOKEN" } }
-
用户名格式非法
400 Bad Request
{ "code": 2, "info": "INVALID_USER_NAME_FORMAT", "data": {} }
-
密码格式非法
400 Bad Request
{ "code": 3, "info": "INVALID_PASSWORD_FORMAT", "data": {} }
-
用户名或密码错误
400 Bad Request
{ "code": 4, "info": "USER_NAME_NOT_EXISTS_OR_WRONG_PASSWORD", "data": {} }
POST /modifypassword¶
用户修改密码。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文样例:
{
"user_name": "Alice",
"old_password": "Bob19937",
"new_password": "Carol48271"
}
正文的 JSON 包含一个字典,字典的各字段含义如下:
字段 | 类型 | 必选 | 含义 |
---|---|---|---|
user_name |
字符串 | 是 | 用户名 |
old_password |
字符串 | 是 | 用户旧密码 |
new_password |
字符串 | 是 | 用户新密码 |
后端接受到请求之后,先检验 token 是否合理。
如果合理,则判断 old_password
是否是该用户的原本密码。
如果原密码正确,则检验新密码是否符合格式,最后进行修改。
-
修改成功
成功修改密码,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
用户名或密码错误
400 Bad Request
{ "code": 4, "info": "USER_NAME_NOT_EXISTS_OR_WRONG_PASSWORD", "data": {} }
POST /avatar¶
修改用户头像。
请求需要在请求头中携带 Authorization
字段,记录 token
值。
请求正文是包含头像文件的 form-data 表单:
{
"file": avatar_file
}
后端接受到请求之后,先检验 token 是否有效。
接下来判断上传头像文件是否存在,文件存在且格式正确则进行修改,并返回头像的 base64 编码。
-
修改成功
成功修改头像,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "id": 1, "user_name": "Bob", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==" } }
-
图片不存在或格式非法
400 Bad Request
{ "code": 18, "info": "AVATAR_FILE_NOT_FOUND", "data": {} }
GET /avatar¶
获取用户头像。
请求需要在请求头中携带 Authorization
字段,记录 token
值。
后端接受到请求之后,先检验 token 是否有效,并返回相应用户头像的 base64 编码。
-
获取成功
成功获取,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "id": 1, "user_name": "Bob", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==" } }
本 API 不应该出错。
POST /signature¶
修改用户头像。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文样例:
{
"signature": "Hello world!"
}
后端接受到请求之后,先检验 token 是否有效,并修改用户签名。
-
修改成功
成功修改签名,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "id": 1, "user_name": "Bob", "signature": "Hello world!" } }
本 API 不应该出错。
POST /logout¶
登出用户。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文无需附带内容。
后端接受到请求之后,先检验 token
是否有效。如有效,将该用户登出。
-
成功登出
成功登出,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
用户未登录
401 Unauthorized
{ "code": 1001, "info": "UNAUTHORIZED", "data": {} }
POST /checklogin¶
检查用户登录状态。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文无需附带内容。
后端接受到请求之后,检验 token
是否有效,并返回登陆状态。
-
登录状态有效
登录状态有效,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
登陆状态失效
401 Unauthorized
{ "code": 1001, "info": "UNAUTHORIZED", "data": {} }
GET /profile/[user_id]¶
返回用户主页信息。
请求正文无需附带内容。
后端接受到请求之后,先检验用户 id 是否有效,并返回用户相关信息。
-
用户存在
用户信息存在,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "id": 1, "user_name": "Bob", "signature": "This is my signature.", "mail": "Bob21@163.com", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "followers": 191, "following": 81, "data": [ { "id": 1, "title": "ILoveCakes", "width": 400, "height": 222, "category": "food", "tags": [ "happy", "laugh", "sad" ], "duration": 1.8, "pub_time": "2023-04-18T04:11:07.785Z", "like": 0 } ] } }
其中
data
是一个数组,其中每个对象各字段含义如下:字段 类型 必选 含义 id
整数 是 用户 ID user_name
字符串 是 用户名 signature
字符串 是(可能为空) 用户签名 mail
字符串 是 用户邮箱 avatar
字符串 是(可能为空) 用户头像 followers
字符串 是 用户粉丝数 following
字符串 是 用户关注数 data
数组 是 用户上传 Gif 信息
-
用户不存在
400 Bad Request
{ "code": 12, "info": "USER_NOT_FOUND", "data": {} }
GET /info/[user_id]¶
返回简短的用户信息。
请求可以在请求头中携带 Authorization
字段,记录 token
值。
请求正文无需附带内容。
后端接受到请求之后,先检验 token 和 id 是否有效,如果有效则返回简短的用户信息。
-
用户存在
用户信息存在,返回如下响应:
200 OK
返回一个 JSON 格式的正文,包含用户信息。
{ "code": 0, "info": "SUCCESS", "data": { "id": 1, "user_name": "Bob", "signature": "This is my signature.", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "is_followed": true } }
其中
data
是一个数组,其中每个对象各字段含义如下:字段 类型 必选 含义 id
整数 是 用户 ID user_name
字符串 是 用户名 signature
字符串 是(可能为空) 用户签名 avatar
字符串 是(可能为空) 用户头像 is_followed
布尔值 是 用户是否被关注
-
用户不存在
400 Bad Request
{ "code": 12, "info": "USER_NOT_FOUND", "data": {} }
GIF 管理相关 /image¶
POST /upload¶
上传 Gif。
请求需要在请求头中携带 Authorization
字段,记录 token
值。
请求正文是包含 Gif 文件的 form-data 表单:
{
"file": gif_file
"title": "Pretty Cat"
"category": "animals"
"tags": ["funny", "cat"]
}
后端接受到请求之后,先检验 token 是否有效。
若经过 Hash 检测得该 Gif 已经被上传过, 直接返回相应 Gif 的 id,否则返回 Gif 内容。
-
Gif 已经被上传过
Gif 已经被上传过,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "id": 514, "duplication": true } }
-
Gif 未被上传过
Gif 未被上传过,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "id": 514, "duplication": false } }
-
Gif 不存在或格式非法
400 Bad Request
{ "code": 10, "info": "INVALID_GIF", "data": {} }
POST /update/[gif_id]¶
更改 Gif 类别标签信息。
请求需要在请求头中携带 Authorization
字段,记录 token
值。
请求正文样例:
{
"category": "animals",
"tags": ["funny", "cat"]
}
后端接受到请求之后,先检验 token 是否有效。如果有效则更新 Gif 内容。
-
Gif 信息更改成功
Gif 信息更改成功,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "id": 514 } }
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
POST /resize¶
压缩并上传 Gif。
请求需要在请求头中携带 Authorization
字段,记录 token
值。
请求正文是包含 Gif 文件的 form-data 表单:
{
"file": gif_file
"title": "Pretty Cat"
"category": "animals"
"tags": ["funny", "cat"]
"ratio": "0.8"
}
后端接受到请求之后,先检验 token 是否有效。如果有效则创建 Gif 压缩任务。
-
任务创建成功
任务创建成功,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "task_id": "ec1e476d-4f95-4d5e-94f3-b094de82c500", "task_status": "PENDING" } }
-
Gif 不存在或格式非法
400 Bad Request
{ "code": 10, "info": "INVALID_GIF", "data": {} }
-
压缩比例不为 0 ~ 1 浮点数
400 Bad Request
{ "code": 21, "info": "INVALID_RATIO", "data": {} }
POST /video¶
上传视频转 Gif。
请求需要在请求头中携带 Authorization
字段,记录 token
值。
请求正文是包含视频文件的 form-data 表单:
{
"file": video_file,
"title": "Pretty Cat",
"category": "animals"
"tags": ["funny", "cat"]
}
后端接受到请求之后,先检验 token 是否有效。如果有效则创建视频转换任务。
-
任务创建成功
任务创建成功,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "task_id": "ec1e476d-4f95-4d5e-94f3-b094de82c500", "task_status": "PENDING" } }
-
视频不存在或格式非法
400 Bad Request
{ "code": 19, "info": "INVALID_VIDEO", "data": {} }
POST /watermark/[gif_id]¶
Gif 添加水印。
请求需要在请求头中携带 Authorization
字段,记录 token
值。
无需附带请求正文。
后端接受到请求之后,先检验 token 是否有效。如果用户为 Gif 上传者则创建水印添加任务。
-
任务创建成功
任务创建成功,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "task_id": "ec1e476d-4f95-4d5e-94f3-b094de82c500", "task_status": "PENDING" } }
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
GET /taskcheck¶
检查用户非阻塞任务状态。
请求需要在请求头中携带 Authorization
字段,记录 token
值。
无需附带请求正文。
后端接受到请求之后,先检验 token 是否有效。
返回当前用户所有任务的状态,如果成功同时返回任务结果。
-
任务状态获取成功
任务状态获取成功,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "task_count": 5, "task_data": [ { "task_id": "ec1e476d-4f95-4d5e-94f3-b094de82c500", "task_type": "resize", "task_status": "STARTED", "task_time": "2023-04-15T13:56:38.484Z" }, { "task_id": "ec1e476d-4f95-4d5e-94f3-b094de82c500", "task_type": "watermark", "task_status": "STARTED", "task_time": "2023-04-15T13:57:38.484Z" }, { "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "video", "task_status": "SUCCESS", "task_time": "2023-04-15T13:58:38.484Z", "task_result": { "id": 6 } } ] } }
task_status
有SATRTED
,SUCCESS
,FAILURE
状态。task_type
有三种格式:resize
,watermark
,video
。-
Gif resize
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "resize", "task_status": "SUCCESS", "task_time": "2023-04-15T13:58:38.484Z", "task_result": { "id": 234, "duplication": false } }
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "resize" "task_status": "SUCCESS", "task_time": "2023-04-15T13:58:38.484Z", "task_result": { "id": 234, "duplication": true } }
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "resize", "task_status": "FAILURE", "task_time": "2023-04-15T13:58:38.484Z" }
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "resize", "task_status": "FAILURE", "task_time": "2023-04-15T13:58:38.484Z", "task_result": { "code": 23, "info": "TOO_LONG_TIME" } }
-
Gif watermark
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "watermark", "task_status": "SUCCESS", "task_time": "2023-04-15T13:58:38.484Z", "task_result": { "id": 234 } }
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "watermark", "task_status": "FAILURE", "task_time": "2023-04-15T13:58:38.484Z", "task_result": { "id": 234, "code": 20, "info": "GIF_TOO_SMALL" } }
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "watermark", "task_status": "FAILURE", "task_time": "2023-04-15T13:58:38.484Z" }
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "watermark", "task_status": "FAILURE", "task_time": "2023-04-15T13:58:38.484Z", "task_result": { "code": 23, "info": "TOO_LONG_TIME" } }
-
Gif video
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "video", "task_status": "SUCCESS", "task_time": "2023-04-15T13:58:38.484Z", "task_result": { "id": 234, "duplication": false } }
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "video", "task_status": "FAILURE", "task_time": "2023-04-15T13:58:38.484Z" }
{ "task_id": "efe4811e-bdbf-49e0-80ad-a93749159cd0", "task_type": "video", "task_status": "FAILURE", "task_time": "2023-04-15T13:58:38.484Z", "task_result": { "code": 23, "info": "TOO_LONG_TIME" } }
-
本 API 不应返回错误。
GET /detail/[gif_id]¶
返回 Gif 信息。
可以在请求头中携带 Authorization
字段来记录 token,可通过 token 来判断 Gif 是否被当前用户点赞。
请求正文无需附带内容。
后端接受到请求之后,先检验 Gif id 是否有效,并返回 Gif 相关信息。
-
Gif 存在
Gif 存在,返回如下响应:
200 OK
{ "code": 0, "info": "Succeed", "data": { "gif_data": { "id": 344, "title": "gif with tags: cute", "uploader": "spider", "width": 312, "height": 300, "category": "cute", "tags": [ "cute", "cat" ], "duration": 1.92, "pub_time": "2023-05-10T10:52:35.620Z", "like": 0, "is_liked": false }, "user_data": { "id": 38, "user_name": "spider", "signature": "", "mail": "gifexplorer_spider@126.com", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "followers": 5, "following": 3, "register_time": "2023-05-10T10:34:42.789Z", "is_followed": true } } }
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
DELETE /detail/[gif_id]¶
删除 Gif。
需要在请求头中携带 Authorization
字段来记录 token。
请求正文无需附带内容。
后端接受到请求之后,先检验 token 是否有效,并删除相应 Gif。
-
删除 Gif 成功
删除 Gif 成功,返回如下响应:
200 OK
{ "code": 0, "info": "Succeed", "data": {} }
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
GET /previewlow/[gif_id]¶
低分辨率预览 Gif。
无需附带请求正文。
返回低分辨率 Gif 内容进行预览。
-
Gif 预览成功
Gif 预览成功,返回一个 HttpResponse 格式的 FileWrapper。
200 OK
... file_wrapper = FileWrapper(gif_file) response = HttpResponse(file_wrapper, content_type='image/gif') response['Content-Disposition'] = f'inline; filename="{gif.name}"' return response
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
GET /image/preview/[gif_id]¶
预览 Gif。
无需附带请求正文。
返回 Gif 内容进行预览。
-
Gif 预览成功
Gif 预览成功,返回如下响应,返回一个 HttpResponse 格式的 FileWrapper。
200 OK
... file_wrapper = FileWrapper(gif_file) response = HttpResponse(file_wrapper, content_type='image/gif') response['Content-Disposition'] = f'inline; filename="{gif.name}"' return response
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
GET /download/[gif_id]¶
下载 Gif。
无需附带请求正文。
返回 Gif 内容进行下载。
-
Gif 下载成功
Gif 下载成功,返回一个 HttpResponse 格式的 FileWrapper。
200 OK
... file_wrapper = FileWrapper(gif_file) response = HttpResponse(file_wrapper, content_type='application/octet-stream') response['Content-Disposition'] = f'attachment; filename="{gif.title}.gif"' return response
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
POST /downloadzip¶
批量下载 Gif。
请求正文样例:
{
"gif_ids": [1, 2, 3, 4]
}
返回相应 id 的 Gif 进行下载。
-
Gif 批量下载成功
Gif 批量下载成功,返回一个 HttpResponse 格式的 ZipFile
200 OK
... with zipfile.ZipFile(zip_buffer, mode='w') as zip_file: for gif in gifs: gif_file = open(gif.giffile.file.path, 'rb') zip_file.writestr(f"{gif.title}.gif", gif_file.read()) gif_file.close() response = HttpResponse(zip_buffer.getvalue(), content_type='application/zip') time = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S') response['Content-Disposition'] = f'attachment; filename="{time}.zip"' return response
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
GET /gifscount¶
批量下载 Gif。
无需附带请求正文。
返回数据库中 Gif 总量。
-
Gif 总量获取成功
Gif 总量获取成功,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": 79473 }
此 API 不应该返回错误。
USER 泛社交相关 /user¶
POST /follow/[user_id]¶
关注用户。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文无需附带内容。
后端接受到请求之后,先检验 token 是否有效,若该用户并非自身且该用户未被关注,则进行关注。
-
成功关注
成功关注用户,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
用户不存在
400 Bad Request
{ "code": 12, "info": "USER_NOT_FOUND", "data": {} }
-
关注用户为自身
400 Bad Request
{ "code": 13, "info": "CANNOT_FOLLOW_SELF", "data": {} }
-
用户已被关注
400 Bad Request
{ "code": 14, "info": "INVALID_FOLLOWS", "data": {} }
POST /unfollow/[user_id]¶
取关用户。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文无需附带内容。
后端接受到请求之后,先检验 token 是否有效,若该用户并非自身且该用户已被关注,则进行取关。
-
成功取关
成功取关用户,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
用户不存在
400 Bad Request
{ "code": 12, "info": "USER_NOT_FOUND", "data": {} }
-
取关用户为自身
400 Bad Request
{ "code": 13, "info": "CANNOT_FOLLOW_SELF", "data": {} }
-
用户未被关注
400 Bad Request
{ "code": 14, "info": "INVALID_FOLLOWS", "data": {} }
GET /followers/[user_id]¶
获取用户的粉丝列表。
请求正文无需附带内容。请求需要携带 query 参数,参数 page 代表需要获取的记录的页码。
示例:
/user/followers/1?page=5
后端接收到请求后,返回指定页码的用户粉丝列表。一页定义为 10 个用户,页码从 1 开始计数。
若 page 不为正整数则应当报错,错误响应在下面定义。
若 page 为正整数则总是正常响应,即使对应的页码并没有记录也是如此,此时返回的用户列表为空。
-
获取成功
成功获取用户粉丝列表,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "page_count": 15, "page_data": [ { "id": 12, "user_name": "Bob", "signature": "It's Me!", "mail": "superBob@163.com", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "followers": 29, "following": 16, "register_time": "2023-05-09T08:03:04.517Z" }, { "id": 15, "user_name": "Bob", "signature": "Hello World!", "mail": "superBob@163.com", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "followers": 9, "following": 6, "register_time": "2023-05-12T08:03:04.517Z" } ] } }
-
页码非正整数
400 Bad Request
{ "code": 6, "info": "INVALID_PAGES", "data": {} }
-
用户不存在
400 Bad Request
{ "code": 12, "info": "USER_NOT_FOUND", "data": {} }
GET /followings/[user_id]¶
获取用户的关注列表。
请求正文无需附带内容。请求需要携带 query 参数,参数 page 代表需要获取的记录的页码。
示例:
/user/followings/1?page=5
后端接收到请求后,返回指定页码的用户关注列表。一页定义为 10 个用户,页码从 1 开始计数。
若 page 不为正整数则应当报错,错误响应在下面定义。
若 page 为正整数则总是正常响应,即使对应的页码并没有记录也是如此,此时返回的用户列表为空。
-
获取成功
成功获取用户关注列表,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "page_count": 15, "page_data": [ { "id": 12, "user_name": "Bob", "signature": "It's Me!", "mail": "superBob@163.com", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "followers": 29, "following": 16, "register_time": "2023-05-09T08:03:04.517Z" }, { "id": 15, "user_name": "Bob", "signature": "Hello World!", "mail": "superBob@163.com", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "followers": 9, "following": 6, "register_time": "2023-05-12T08:03:04.517Z" } ] } }
-
页码非正整数
400 Bad Request
{ "code": 6, "info": "INVALID_PAGES", "data": {} }
-
用户不存在
400 Bad Request
{ "code": 12, "info": "USER_NOT_FOUND", "data": {} }
POST /message/post¶
用户发送私信。
在请求头中携带 Authorization 字段来记录 token,可通过 token 来确定用户身份。
请求正文样例:
{
"user_id": 3,
"message": "Hello!"
}
各字段含义如下:
字段 | 类型 | 必选 | 含义 |
---|---|---|---|
user_id |
整数 | 是 | 私信用户 ID |
message |
字符串 | 是 | 私信内容 |
后端接受到请求之后,先检验 token 是否有效,如果有效且该私信用户非自身则发送私信。
-
成功发送私信
若成功发送私信,则返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "sender": 1, "receiver": 4, "message": "Hello!", "pub_time": "2023-04-25T17:13:55.648217Z" } }
各字段含义如下:
字段 类型 必选 含义 sender
整数 是 发送用户 ID receiver
整数 是 接收用户 ID message
字符串 是 私信内容 pub_time
字符串 是 私信时间
-
用户不存在
400 Bad Request
{ "code": 12, "info": "USER_NOT_FOUND", "data": {} }
-
私信用户为自身
400 Bad Request
{ "code": 22, "info": "CANNOT_MESSAGE_SELF", "data": {} }
GET /message/list¶
获取用户指定页数的私信对象记录,每个私信用户返回元信息、最后一条信息的内容与发送时间。
在请求头中携带 Authorization 字段来记录 token,可通过 token 来确定用户身份。
请求需要携带 query 参数,参数 page 代表需要获取的消息列表的页码。
示例:
/user/message/list?page=5
后端接收到请求后,返回指定页码的用户关注列表,返回顺序默认按照时间倒序排列。一页定义为 10 条私信,页码从 1 开始计数。
若 page 不为正整数则应当报错,错误响应在下面定义。
若 page 为正整数则总是正常响应,即使对应的页码并没有记录也是如此,此时返回的私信列表为空。
-
成功获取私信记录
成功获取私信记录,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "page_count": 2, "page_data": [ { "user": { "id": 2, "user_name": "Bob", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "signature": "This is my future" }, "message": { "message": "See you next time!", "pub_time": "2023-05-17T02:09:00.167Z", "is_read": false } }, { "user": { "id": 3, "user_name": "Alice", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "signature": "Hello world" }, "message": { "message": "Long time no see...", "pub_time": "2023-05-17T02:08:29.733Z", "is_read": true } } ] } }
-
页码非正整数
400 Bad Request
{ "code": 6, "info": "INVALID_PAGES", "data": {} }
GET /message/read/[user_id]¶
获取与指定用户的私信记录。
在请求头中携带 Authorization 字段来记录 token,可通过 token 来确定用户身份。
请求需要携带 query 参数,参数 page 代表需要获取的消息列表的页码。
示例:
/user/message/read/4?page=5
后端接收到请求后,返回指定页码的用户私信内容,返回顺序默认按照时间倒序排列。
将用户对其的所有私信状态置为已阅读,一页定义为 50 条私信,页码从 1 开始计数。
若 page 不为正整数则应当报错,错误响应在下面定义。
若 page 为正整数则总是正常响应,即使对应的页码并没有记录也是如此,此时返回的私信列表为空。
-
成功获取消息记录
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "page_count": 7, "page_data": [ { "sender": 3, "receiver": 1, "message": "See you next time!", "pub_time": "2023-05-17T02:08:29.733Z" }, { "sender": 1, "receiver": 3, "message": "Nice to chat", "pub_time": "2023-05-17T02:02:54.144Z" }, { "sender": 3, "receiver": 1, "message": "What's up man?", "pub_time": "2023-05-17T01:01:53.578Z" }, { "sender": 1, "receiver": 3, "message": "Hi", "pub_time": "2023-05-17T01:01:22.343Z" } ] } }
-
页码非正整数
400 Bad Request
{ "code": 6, "info": "INVALID_PAGES", "data": {} }
-
用户不存在
400 Bad Request
{ "code": 12, "info": "USER_NOT_FOUND", "data": {} }
-
私信用户为自身
400 Bad Request
{ "code": 22, "info": "CANNOT_MESSAGE_SELF", "data": {} }
GET /readhistory¶
获取用户访问的历史记录。
在请求头中携带 Authorization 字段来记录 token,可通过 token 来确定用户身份。
请求需要携带 query 参数,参数 page 代表需要获取的历史记录的页码。
1 |
|
/user/message/readhistory?page=5
后端接收到请求后,返回指定页码的用户私信内容。一页定义为 20 个 Gif 历史记录,页码从 1 开始计数。
若 page 不为正整数则应当报错,错误响应在下面定义。
若 page 为正整数则总是正常响应,即使对应的页码并没有记录也是如此,此时返回的私信列表为空。
-
历史记录获取成功
用户历史记录获取成功,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "page_count": 15, "page_data": [ { "data": { "id": 117, "title": "This is a Pretty Gif", "width": 400, "height": 250, "duration": 5.2, "uploader": "Bob", "uploader_id": 4, "category": "beauty", "tags": ["beauty", "fun"], "like": 412, "pub_time": "2023-04-25T17:13:55.648217Z" }, "visit_time": "2023-04-25T17:13:55.648217Z" } ] } }
-
页码非正整数
400 Bad Request
{ "code": 6, "info": "INVALID_PAGES", "data": {} }
POST /readhistory¶
记录用户访问 Gif 的记录。
在请求头中携带 Authorization 字段来记录 token,可通过 token 来确定用户身份。
请求需要携带 query 参数,参数 id 代表用户点击的 Gif 的 ID。
1 |
|
/user/readhistory?id=5
后端接收到请求后,根据用户点击的 Gif 来进行用户标签、阅读历史等功能的更新。
在用户历史记录中更新并记录此 Gif 访问状态。
-
历史记录更改成功
用户历史记录添加成功,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
GET /personalize¶
返回用户偏好的 Gif 图组.
在请求头中携带 Authorization 字段来记录 token,可通过 token 来确定用户身份。无需附带请求正文。
后端接受到请求之后,先检验 token 是否有效,并向搜索后端发送用户 tags 作为查询关键词的搜索请求。
每次返回的 Gif 最多不超过 10 个,并默认按照关匹配程序进行排序。
-
获取推荐成功
用户个性推荐获取成功,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "gif_ids": [ "221", "252", "253", "254", "255", "256", "257", "226", "227", "228" ] } }
本 API 不应该出现错误。
GIF 泛社交相关 /image¶
POST /like/[gif_id]¶
点赞 Gif。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文无需附带内容。
后端接受到请求之后,先检验 token 是否有效,若 Gif 存在,且用户未对该 Gif 点赞,则进行点赞。
-
成功点赞
成功点赞 Gif,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
Gif 已被点赞过
400 Bad Request
{ "code": 5, "info": "INVALID_LIKES", "data": {} }
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
POST /cancellike/[gif_id]¶
取消点赞 Gif。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文无需附带内容。
后端接受到请求之后,先检验 token 是否有效,若 Gif 存在,且用户已对该 Gif 点赞,则取消点赞。
-
成功取消点赞
成功取消点赞 Gif,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
Gif 未被点赞过
400 Bad Request
{ "code": 5, "info": "INVALID_LIKES", "data": {} }
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
POST /comment/[gif_id]¶
评论 Gif。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文样例:
{
"content": "这是一条子评论",
"parent_id": 10
}
{
"content": "这是一条父评论"
}
其中 parent_id
为可选字段,表示该评论以 id
为 parent_id
的评论为二级评论。
后端接受到请求之后,先检验 token 是否有效。如果 Gif 存在,依据评论等级作出不同行为:
如果评论为二级评论,先检验相应的一级评论是否存在。若存在,则创建一条二级评论。
如果评论为一级评论,直接创建一条一级评论。
-
成功评论
成功评论 Gif,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": { "id": 2, "user": "Alice", "content": "你说得对,但是……", "pub_time": "2023-04-15T14:41:21.525Z" } }
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
-
父评论不存在
400 Bad Request
{ "code": 11, "info": "COMMENTS_NOT_FOUND", "data": {} }
DELETE /comment/delete/[comment_id]¶
删除 Gif 评论。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文无需附带内容。
后端接受到请求之后,先检验 token 是否有效。
如果评论存在,且评论发送者为该用户,则删除评论。
-
成功删除评论
成功删除 Gif 评论,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
评论不存在
400 Bad Request
{ "code": 11, "info": "COMMENTS_NOT_FOUND", "data": {} }
GET /comment/[gif_id]¶
获取 Gif 的所有评论。
请求可以在请求头中携带 Authorization 字段,记录 token 值,判断评论是否被当前用户点赞。
请求正文无需附带内容。
后端接受到请求之后,先检验 token 是否有效,若 Gif 存在,且用户已对该 Gif 点赞,则取消点赞。
-
成功获取评论
成功获取 Gif 评论,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": [ { "id": 2, "user": "Alice", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "content": "这是一条测试评论", "pub_time": "2023-04-16T07:32:50.906Z", "like": 0, "is_liked": false, "replies": [] }, { "id": 1, "user": "Alice", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "content": "这是一条测试评论", "pub_time": "2023-04-16T07:32:49.948Z", "like": 1, "is_liked": true, "replies": [ { "id": 3, "user": "Alice", "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAABBmlDQ1BJQ0MgUHJvZmlsZQAAeJxjYGCSYAACFgMGhty8kqIgdyeFiMgoBQYkkJhcXMCAGzAyMHy7BiIZGC7r4lGHC3CmpBYnA+kPQFxSBLQcaGQKkC2SDmFXgNhJEHYPiF0UEuQMZC8AsjXSkdhJSOzykoISIPsESH1yQRGIfQfItsnNKU1GuJuBJzUvNBhIRwCxDEMxQxCDO4MTGX7ACxDhmb+IgcHiKwMD8wSEWNJMBobtrQwMErcQYipAP/C3MDBsO1+QWJQIFmIBYqa0NAaGT8sZGHgjGRiELzAwcEVj2oGICxx+VQD71Z0hHwjTGXIYUoEingx5DMkMekCWEYMBgyGDGQCSpUCz8yM2qAABAABJREFUeJzk/Vmzbdl1Hoh93xhzrrV2c7rbZt5MZIMu0RAgKJIig0VSpa4kMUoul0vh0IPDoQi7XuwIh3+M3yocDkf4QU1VOaSyJFOiRLJEASTRkgAJIIHsM+/N299zzm7WWnOOMfyw9jn3ZuZNIBNIUCVrBCLz5ME+e88912zG+MY3vsH4HwIVGEfzoajXhcY83evGu10P+qo/XW22Q81mXbXcz/==", "content": "这是一条测试评论", "pub_time": "2023-04-16T07:32:55.238Z", "like": 0, "is_liked": false } ] } ] }
-
Gif 不存在
400 Bad Request
{ "code": 9, "info": "GIFS_NOT_FOUND", "data": {} }
POST /comment/like/[comment_id]¶
点赞评论。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文无需附带内容。
后端接受到请求之后,先检验 token 是否有效,若评论存在,且用户未对该评论点赞,则进行点赞。
-
成功点赞
成功点赞评论,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
评论已被点赞过
400 Bad Request
{ "code": 5, "info": "INVALID_LIKES", "data": {} }
-
评论不存在
400 Bad Request
{ "code": 11, "info": "COMMENTS_NOT_FOUND", "data": {} }
POST /comment/cancellike/[comment_id]¶
取消点赞评论。
请求需要在请求头中携带 Authorization 字段,记录 token 值。
请求正文无需附带内容。
后端接受到请求之后,先检验 token 是否有效,若评论存在,且用户已对该评论点赞,则取消点赞。
-
成功取消点赞
成功取消点赞评论,返回如下响应:
200 OK
{ "code": 0, "info": "SUCCESS", "data": {} }
-
评论未被点赞过
400 Bad Request
{ "code": 5, "info": "INVALID_LIKES", "data": {} }
-
评论不存在
400 Bad Request
{ "code": 11, "info": "COMMENTS_NOT_FOUND", "data": {} }