解决自动化流中的 JSON 与 HTML 字符冲突
Backend
JSON WordPress Dify API 冲突原因
在自动化工作流中,把大段 HTML 塞进 JSON Body 发送给 WordPress 等服务器时,经常会触发 400 错误。
原因是 JSON 规定键(Key)和字符串值(Value)必须用双引号 " 包裹。而 HTML 的属性(如 class="card")也使用双引号。当变量直接替换进入 JSON 模板时,HTML 内部的双引号会提前闭合 JSON 的字符串边界,导致结构破碎。
此外,HTML 中的物理换行符在 JSON 字符串中也是非法的,必须转换为 \n。
错误示例
如果在 Dify 的 HTTP 节点中手动拼接如下结构:
{
"title": "测试",
"content": "{{html_code}}"
}
当 html_code 包含
时,服务器收到的真实数据是:
{
"title": "测试",
"content": "<div class="manga-card">"
}
解析器读取到 content 的第二个双引号时认为字符串已结束,后面的 manga-card">" 会被判定为非法语法,导致请求失败。
解决方案:引入序列化节点
不要在 HTTP 节点的界面里手动拼凑 JSON。标准做法是在发送请求前,增加一个 Python 脚本节点,利用 json.dumps() 自动处理转义。
json.dumps() 会执行以下操作:
扫描文本,将内部双引号"转义为\"。
将物理换行符转义为 \n。
确保输出的字符串完全符合 JSON 规范。
Python 节点代码实现
import json
def main(html_code: str) -> dict:
# 1. 简单处理 HTML 首尾换行
safe_html = "\n" + html_code + "\n"
# 2. 构建 Python 字典,此时无需担心引号冲突
payload = {
"title": "自动化发布测试",
"content": safe_html,
"status": "draft",
"categories": [1]
}
# 3. 序列化为安全字符串,关闭 ASCII 强制转换以保留中文
final_json = json.dumps(payload, ensure_ascii=False)
return {
"safe_json_body": final_json
}
标准操作流程 (SOP) 处理大段复杂文本或代码的 HTTP 发送任务时,应遵循以下链路:
- 废弃可视化组装:停止在 HTTP 节点的 JSON 框里直接引用变量。
- 加入打包节点:在请求前置位增加 Python 代码节点。
- 字典序列化:在代码里构建 Dict,通过 json.dumps 输出最终字符串。
- 发送 Raw Data:在 HTTP 节点的 Body 设置中选择
raw,直接填入上一步生成的字符串变量。Header 保持Content-Type: application/json。
通过这种方式,发送给服务器的数据将呈现为标准形态:
"content": "\n<div class=\"manga-card\">\n..."
服务器会正确识别 ” 为普通字符,从而保证链路的稳定性。