Skip to content

开放接口

申请开通

登录妙花笔记APP,点击【设置】-【开放接口】即可获取专属密钥(Token),用于下列开放接口 请注意:重置专属密钥(Token)会导致旧密钥失效。

创建笔记

POST https://api.memoreka.com/open/create

请求头(Header)

Content-Type: application/json  
Token: 专属密钥

说明
该接口用于创建笔记,正文支持Markdown
如果要插入本地多媒体,需要先通过 https://api.memoreka.com/open/upload 上传获取 name(详见下文上传文件章节),并以 ![](name) 形式插入

请求 (Request)

json
{
    "title": "笔记标题(如果不需要,传输空字符串)", 
    "content": "笔记内容(不能为空)", 
    "book": "笔记本名称(不能为空,且必须为已存在的,未关闭的笔记本)", 
    "category": "笔记模式(note = 备忘录;todo = 待办;如果输入错误参数将默认为 todo 模式)", 
}

回复(Response)
如果创建成功会收到 Status Code = 200
如果失败则会进行对应报错

示例代码

js
fetch('https://api.memoreka.com/open/create', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Token': '你的专属密钥'
  },
  body: JSON.stringify({
    'title': '这是标题',
    'content': '这是内容',
    'book': '测试',
    'category': 'note'
  })
})

上传文件

POST https://api.memoreka.com/open/upload

请求头(Header)

Content-Type: multipart/form-data; boundary=<calculated when request is sent>
Token: 专属密钥  
Offset:分片偏移量(已上传的Byte数)  
Size:文件总大小

注意 Content-Type 通常为程序自动设置,这样可以确保boundary设置正确

说明
为了防止文件过大耗时过长或失败,上传文件接口需要根据文件大小做特殊处理
如果文件大小 <= 4MB,则可以一次性上传,该情况请求头(Header)的 Offset = 0,Size = 0
如果文件大小 > 4MB,需要进行分片上传。
即按照顺序,将文件切割为 <= 4MB 的切片,
按照顺序,从第一个切片开始循环上传,直到全部上传完成。
每次上传需要在请求头(Header)中附带Offset和Size信息。
Offset为已上传Byte大小,Size为文件的总大小。

请求 (Request)
MultipartForm,Key = "file"
注意 请确保上传的file文件名带有正确的格式后缀(如 .png, .mp4 等),否则可能造成传输后无法读取

回复(Response)

json
{
    "name": "文件名 name 可直接在笔记正文 content 中引用,为 ![](name),在第一个分片上传后会生成该文件名,后续需要在MultipartForm中设置该name为文件名(Filename),否则无法正确拼接已上传文件,并报错", 
    "size": 0, //int,当前服务端已接收到的 byte 大小,传下个分片的时候应当携带HEADER Offset=该返回值。
    //如果传输的 Offset > 服务端已上传大小,将无法正常上传该分片,并返回报错信息,这时应该从正确的Offset开始,或者从0开始
    //如果 Offset < 服务端已上传大小,将会正常返回200,并返回正确的,服务端已上传的大小(返回中的size),下次上传时应当将该正确值作为HEADER Offset设置
}

示例代码

html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <input type="file" id="file">
  <button id="submit">提交</button>
  <script>
    const file = document.getElementById('file')
    const button = document.getElementById('submit')
    // 4MB
    const DEFAULT_CHUNK_SIZE = 1024 * 1024 * 4
    const resp = { file: '', name: '', offset: 0 }

    const upload = (data) => {
      const size = resp.file.size > DEFAULT_CHUNK_SIZE ? resp.file.size : 0
      return fetch('https://api.memoreka.com/open/upload', {
        method: 'POST',
        headers: {
          'Token': '你的专属密钥',
          'Offset': resp.offset,
          'Size': size
        },
        body: data
      }).then(res => res.json())
    }

    file.addEventListener('change', function(event) {
      resp.file = event.target.files[0]
      resp.name = resp.file.name
    })

    button.addEventListener('click', function(event) {
      uploadChunkFile()
    })

    async function uploadChunkFile() {
      const data = new FormData()
      const chunk = resp.file.slice(resp.offset, resp.offset + DEFAULT_CHUNK_SIZE)
      const file = new File([chunk], resp.name, { type: resp.file.type })
      data.append('file', file)
      try {
        const res = await upload(data)
        if (res) {
          resp.name = res.name
          resp.offset = res.size
        }
        if (resp.file.size !== resp.offset) {
          uploadChunkFile()
        }
      } catch (err) {
        console.log(`err: `, err)
      }
    }
  </script>
</body>
</html>

其他说明

  1. 使用开放接口需要开启云同步功能。
  2. 从开放接口创建或上传将消耗同步流量,请注意流量余额。
  3. 文字内容支持Markdown格式及标签