关于使用halo接口api发布文章的使用说明

jdysya
jdysya

文档接口

halo博客附带的后端接口是可以直接调用的,其中创建文章的接口是http://localhost:8090/api/admin/posts1,对应的参数结构如下所示

参数结构

//application/json
{
-   "categoryIds": [
    -   0 
    ],
-   "content": "string",
-   "createTime": "2019-08-24T14:15:22Z",
-   "disallowComment": true,
-   "editorType": "MARKDOWN",
-   "keepRaw": true,
-   "metaDescription": "string",
-   "metaKeywords": "string",
-   "metas": [
    -   { 
        -   "key": "string",    
        -   "postId": 0,   
        -   "value": "string"
        }
    ],
-   "originalContent": "string",
-   "password": "string",
-   "slug": "string",
-   "status": "DRAFT",
-   "summary": "string",
-   "tagIds": [
    -   0 
    ],
-   "template": "string",
-   "thumbnail": "string",
-   "title": "string",
-   "topPriority": 0
}

参数说明

对于比较重要的便是对于originContentcontent的区别,顾名思义 originContent是原始内容,指的是markdown格式的内容,而content则是将markdown渲染为html之后的内容

keepRaw参数为false表示用markdown进行渲染,反之则使用html进行渲染

  1. 对于数学公式而言,需要直接渲染html,因为博客需要自定义引入对应的渲染数学公式的js库后才能正常渲染数学公式,而且这个过程还比较慢,所以建议直接就提前把渲染好的html进行展示
  2. 另一方面,由于原渲染markdown的库中渲染mermaid代码时用到了document对象,在服务端node环境下执行会报错,考虑到本人并不是常用mermaid,这个问题就暂时搁置下来了

实现过程

踩坑

这个过程还是比较痛苦的,因为对于模块化了解的不是很多,文档说的也不是很清楚,所以花了很多时间踩坑,我们首先去官网看文档, 只有如下寥寥几句

由于我是需要相对应的接口在laravel项目中调用,为了便于使用js库,我又新建了一个express项目,这里坑就来了,首先这个express用的是CommonJs规范,是不能使用这种import的引入格式的,然而直接使用require格式的引入也不行,他会提示错误,这个错误在网上找了半天,也没有得到解决方案,有说是node版本过低,也有说是变量命名不规范,但是这个项目文件名就带有-,我能有什么办法!?

解决方案

无奈之下,我们只能采取import的导入方式,由于这种模块化的导入方式是ES6的方式,我们需要在package.json中进行配置,即在根标签下加上

{

...

"type": "module",

...
}

只在项目下面的package.json还不够,我们还需要去对应的node_modules中对应的package.json中加上

至此,才算是正常引入了这个解析markdown的库

封装接口

import express from "express";
import { markdownIt as markdownRender } from "@halo-dev/markdown-renderer";

const app = express();
app.use(express.json()); // for parsing application/json
app.use(express.urlencoded({ extended: true }));
const port = 3000;

app.get("/", (req, res) => {
const result = "$a$";
console.log(result);
res.send(result);
});

app.post("/md", (req, res) => {
let data = {
res: markdownRender.render(req.body.msg),
};
res.json(data);
});

app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});

封装完后调用对应的 baseUrl/md,post请求将md内容传进去,就会返回对应解析后的的html格式的内容

相关链接

Markdown Renderer,md渲染库

Creates a post,对应的创建文章的接口

Footnotes

  1. 需要注意的是这里的localhost指的是本地ip,对应的端口也会根据配置文件的不同而不同