# API
应用的部分 API 设计如下,你可以根据自己的需求单独调用。
API 设计采用 RESTful 方案,异常尽量使用 HTTP 自带的状态表示,并包含文字说明与文档链接。部分 API 的设计方式参考自 GitHub REST API - GitHub Docs (opens new window) 。
# /api
 # GET /ping
 测试服务是否正常。
Request: GET /api/ping
Response: 200 TEXT
pong
# GET /file/:id
 获取指定文件。
Request: GET /api/file/:id
Response: 200 JSON
{
    "message":"Got it",
    "data":{
        "id":"08098f93-0ea4-415d-9d39-7ddef326b9b1",
        "created_at":"2020-12-31T17:07:02.297Z",
        "updated_at":"2020-12-31T17:07:02.297Z",
        "name":"",
        "type":"",
        "content":"",
        "options":{
            "auto_save":true,
            "word_wrap":false,
            "font_family":"'IBM Plex Mono', 'Menlo', 'DejaVu Sans Mono','Bitstream Vera Sans Mono', Courier, monospace",
            "font_size":14,
            "line_height":22,
            "updated_at":"2020-12-31T17:07:02.297Z"
        }
    },
    "authentication":"owner"
}
# GET /file/:id/raw
 获取指定文件的内容。
Request: GET /api/file/:id/raw
Response: 200 TEXT
File content ...
# GET /file/:id/history
 获取指定文件的修改历史。
Request: GET /api/file/:id/history
Response: 200 JSON
其中 data 为一个数组,对应文件的多次历史。
{
    "message": "Got it", 
    "data": [
        {
            "id": "d21396b0-2375-4fd6-b25e-b5f724257ca0", 
            "created_at": "2020-12-25T09:08:46.701Z", 
            "updated_at": "2020-12-25T09:08:57.901Z", 
            "name": "Test.js", 
            "type": "text", 
            "content": "...", 
            "options": {
                "auto_save": true, 
                "word_wrap": false, 
                "font_family": "'IBM Plex Mono', 'Menlo', 'DejaVu Sans Mono','Bitstream Vera Sans Mono', Courier, monospace", 
                "font_size": 14, 
                "line_height": 22, 
                "updated_at": "2020-12-25T09:08:46.701Z"
            }
        }, 
        {
            "id": "d21396b0-2375-4fd6-b25e-b5f724257ca0", 
            "created_at": "2020-12-25T09:08:46.701Z", 
            "updated_at": "2020-12-29T14:15:59.558Z", 
            "name": "Test.js", 
            "type": "text", 
            "content": "...", 
            "options": {
                "auto_save": true, 
                "word_wrap": false, 
                "font_family": "'IBM Plex Mono', 'Menlo', 'DejaVu Sans Mono','Bitstream Vera Sans Mono', Courier, monospace", 
                "font_size": 14, 
                "line_height": 22, 
                "updated_at": "2020-12-25T09:08:46.701Z"
            }
        }
    ]
}
# POST /file
 新建文件。
Request: POST /api/file
Body: JSON
{
    "created_at": "2021-01-03T06:26:42.134Z", 
    "updated_at": "2021-01-03T06:26:42.134Z", 
    "name": "", 
    "type": "", 
    "content": "", 
    "options": {
        "auto_save": true, 
        "word_wrap": false, 
        "font_family": "'IBM Plex Mono', 'Menlo', 'DejaVu Sans Mono','Bitstream Vera Sans Mono', Courier, monospace", 
        "font_size": 14, 
        "line_height": 22, 
        "updated_at": "2021-01-03T06:26:42.134Z"
    }
}
Response: 200 JSON
{
    "message": "Got it", 
    "data": {
        "id": "92bcbd08-3793-4cd4-b76e-9e09e7a5363e", 
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjkyYmNiZDA4LTM3OTMtNGNkNC1iNzZlLTllMDllN2E1MzYzZSIsIm5iZiI6MTYwOTY1NTIwMX0.M2OxCxgXK_BXjoEniCsA7-IXDTMnMgkuIphaNiG9o_I"
    }
}
# PUT /file/:id
 更新整个文件(按 Ctrl + S 时)。
Request: PUT /api/file/:id 需要身份验证
Headers:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjkyYmNiZDA4LTM3OTMtNGNkNC1iNzZlLTllMDllN2E1MzYzZSIsIm5iZiI6MTYwOTY1NTIwMX0.M2OxCxgXK_BXjoEniCsA7-IXDTMnMgkuIphaNiG9o_I
Body: JSON
{
    "updated_at": "2021-01-03T06:37:03.863Z", 
    "content": "...", 
    "name": "123.txt", 
    "type": "Text", 
    "options": {
        "auto_save": true, 
        "word_wrap": false, 
        "font_family": "'IBM Plex Mono', 'Menlo', 'DejaVu Sans Mono','Bitstream Vera Sans Mono', Courier, monospace", 
        "font_size": 14, 
        "line_height": 22, 
        "updated_at": "2021-01-03T06:26:42.134Z"
    }
}
Response: 200 JSON
{
    "message": "Updated"
}
# PATCH /file/:id/:key
 更新部分文件,根据 key 判断要更新哪一部分。
其中 key 有 3 种选择:
name文件名称content文件内容options文件设置
Request: PATCH /api/file/:id/:key 需要身份验证
Headers:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjkyYmNiZDA4LTM3OTMtNGNkNC1iNzZlLTllMDllN2E1MzYzZSIsIm5iZiI6MTYwOTY1NTIwMX0.M2OxCxgXK_BXjoEniCsA7-IXDTMnMgkuIphaNiG9o_I
Body: JSON
{
    "updated_at": "2021-01-03T06:37:03.863Z", 
    "content": "..."
}
Response: 200 JSON
{
    "message": "Updated"
}
# DELETE /file/:id
 删除文件。
Request: DELETE /api/file/:id 需要身份验证
Headers:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjkyYmNiZDA4LTM3OTMtNGNkNC1iNzZlLTllMDllN2E1MzYzZSIsIm5iZiI6MTYwOTY1NTIwMX0.M2OxCxgXK_BXjoEniCsA7-IXDTMnMgkuIphaNiG9o_I
Response: 200 JSON
{
    "message": "Deleted"
}
# GET /admin
 获取服务器上的所有文件。
Request: GET /api/admin 需要身份验证
Headers:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjkyYmNiZDA4LTM3OTMtNGNkNC1iNzZlLTllMDllN2E1MzYzZSIsIm5iZiI6MTYwOTY1NTIwMX0.M2OxCxgXK_BXjoEniCsA7-IXDTMnMgkuIphaNiG9o_I
Response: 200 JSON
{
    "message":"Got it",
    "data":[
        {
            "id":"3ed8320d-dd70-49a7-a125-d650d1e6d680",
            "created_at":"2020-12-24T03:23:33.347Z",
            "updated_at":"2020-12-24T03:26:03.439Z",
            "name":"README.md",
            "type":"markdown"
        },
        {
            "id":"dea62e9b-1aac-4c49-b957-e31975f4750a",
            "created_at":"2020-12-24T06:12:49.630Z",
            "updated_at":"2020-12-24T06:14:40.822Z",
            "name":"Test.go",
            "type":"text"
        }
    ]
}
# POST /admin
 管理员页面登录。
Request: POST /api/admin
Body: JSON
{
    "password":"1234"
}
Response: 200 JSON
{
    "message":"Welcome",
    "data":{
        "token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE2MDk2NTYzNTZ9.I0dWGnpqg3kKObH2QgQ4rPAk9AVoXCZ25ngnUSrdK0I"
    }
}
# DELETE /admin/file/:id
 删除文件。
Request: DELETE /api/admin/file/:id 需要身份验证
Headers:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjkyYmNiZDA4LTM3OTMtNGNkNC1iNzZlLTllMDllN2E1MzYzZSIsIm5iZiI6MTYwOTY1NTIwMX0.M2OxCxgXK_BXjoEniCsA7-IXDTMnMgkuIphaNiG9o_I
Response: 200 JSON
{
    "message": "Deleted"
}
# DELETE /admin/files
 删除多个文件。
Request: DELETE /api/admin/files 需要身份验证
Headers:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjkyYmNiZDA4LTM3OTMtNGNkNC1iNzZlLTllMDllN2E1MzYzZSIsIm5iZiI6MTYwOTY1NTIwMX0.M2OxCxgXK_BXjoEniCsA7-IXDTMnMgkuIphaNiG9o_I
Body: JSON
{
    "files": [
        "d21396b0-2375-4fd6-b25e-b5f724257ca0", 
        "190b19d5-6e5f-4ca2-a2b9-bfe78027ed75", 
        "8d3bba18-db84-485a-8a35-8ac1384d043d"
    ]
}
Response: 200 JSON
{
    "message": "Deleted"
}
# /websocket
 # WS /ping
 测试服务是否正常。
Request: WS /websocket/ping
Message: TEXT
pong
# WS /file/:id
 在打开云端(非创建者)文件时,会自动建立 WebSocket 连接,文件未来的所有改动都会实时推送过来。
Request: WS /websocket/file/:id
Message: JSON
{
    "id": "d21396b0-2375-4fd6-b25e-b5f724257ca0", 
    "created_at": "2020-12-25T09:08:46.701Z", 
    "updated_at": "2021-01-03T06:12:02.176Z", 
    "name": "Test.js", 
    "type": "text", 
    "content": "...", 
    "options": {
        "auto_save": true, 
        "word_wrap": false, 
        "font_family": "'IBM Plex Mono', 'Menlo', 'DejaVu Sans Mono','Bitstream Vera Sans Mono', Courier, monospace", 
        "font_size": 14, 
        "line_height": 22, 
        "updated_at": "2020-12-25T09:08:46.701Z"
    }
}
# 异常
# Response 格式
异常返回的格式如下:
{
    "message": "...", 
    "documentation": "https://lifeni.github.io/i-show-you/api"
}
message 中为异常的类型。
documentation 为帮助文档,也就是现在这个页面。
# HTTP Code 参考
| Code | Message | 含义 | 
|---|---|---|
| 200 | OK | 成功获得数据或者执行操作 | 
| 400 | Bad Request | 请求中包含多余的参数、请求体不匹配、功能或者服务未启用 | 
| 401 | Unauthorized | 没有权限 | 
| 403 | Forbidden | 权限验证失败 | 
| 404 | Not Found | 文件、历史记录不存在 | 
| 500 | Internal Server Error | 服务端出错,多为数据库的问题 |