用 Go 快速搭建一个 Coze (扣子)API 流式回复模拟接口(Mock Server)

用 Go 快速搭建一个 Coze (扣子) API 流式回复模拟接口(Mock Server)

在开发 Coze Bot 相关的前端功能时,我们经常需要测试流式回复(SSE)的打字机效果、加载状态、停止响应、内容渲染等逻辑。但直接调用真实的 Coze API 会消耗 token,而且回复速度和内容不可控。

下面分享一个纯 Go 实现的本地模拟接口 ,只需几分钟就能跑起来,完全兼容 Coze 的 /v3/chat 流式返回格式,让你零成本、无限次地测试前端体验。

功能亮点
  • 完美还原 Coze 的 SSE 流式结构(event: conversation.message.delta + data: {"content":"..."})
  • 逐字打字机效果,延迟随机 50~150ms,模拟真人输入
  • 支持 CORS,前端直接调用无需额外配置
  • 回复内容支持 Markdown,前端可直接渲染
  • 自动发送 [DONE] 结束标志
  • 代码简洁,只有不到 100 行
完整代码(mock_coze.go)
go 复制代码
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"strings"
	"time"
)

const proxyPort = ":8680"

func main() {
	http.HandleFunc("/coze-chat", mockHandler)

	log.Printf("[MOCK] 模拟 Coze 接口已启动")
	log.Printf("[MOCK] 监听地址: http://localhost%s/coze-chat", proxyPort)
	log.Printf("[MOCK] 可直接用你原来的前端代码测试(无需 token)")
	log.Fatal(http.ListenAndServe(proxyPort, nil))
}

func mockHandler(w http.ResponseWriter, r *http.Request) {
	clientIP := r.RemoteAddr
	log.Printf("[MOCK REQUEST] %s %s from %s", r.Method, r.URL.Path, clientIP)

	// 处理 CORS 预检
	if r.Method == http.MethodOptions {
		w.Header().Set("Access-Control-Allow-Origin", "*")
		w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS")
		w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
		w.Header().Set("Access-Control-Max-Age", "86400")
		w.WriteHeader(http.StatusNoContent)
		return
	}

	if r.Method != http.MethodPost {
		http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
		return
	}

	// 读取请求体(仅模拟,可忽略内容)
	_, _ = io.ReadAll(r.Body)
	defer r.Body.Close()

	// 设置 SSE 响应头
	w.Header().Set("Content-Type", "text/event-stream")
	w.Header().Set("Cache-Control", "no-cache")
	w.Header().Set("Connection", "keep-alive")
	w.Header().Set("Access-Control-Allow-Origin", "*")
	w.(http.Flusher).Flush()

	// 自定义回复内容(支持 Markdown,随时修改)
	fullResponse := `# 时尚审美评估师

**评判结果**:好看

**理由**:
- 这件帽衫的深灰色非常百搭,经典不过时,适合各种肤色。
- 版型宽松舒适,oversize 设计很有街头感,显瘦又时髦。
- 帽绳和袖口细节处理精致,质感看起来很不错(棉感强,不廉价)。
- 前胸的小logo绣标低调有质感,不会太张扬。
- 整体风格偏休闲运动风,日常穿搭、约会、逛街都非常合适。

**搭配建议**:
- 下装:黑色或深蓝牛仔裤 + 白球鞋(经典安全)
- 进阶:卡其色工装裤 + 马丁靴(更有层次)
- 外搭:短款羽绒服或风衣(冬天显高)

总体来说,这件帽衫设计简洁大方,性价比应该很高,值得入手!✨`

	// 逐字输出,模拟打字机效果
	for _, char := range fullResponse {
		fmt.Fprintf(w, "event: conversation.message.delta\n")
		fmt.Fprintf(w, "data: {\"id\":\"mock123\",\"conversation_id\":\"mock\",\"bot_id\":\"mock\",\"role\":\"assistant\",\"type\":\"answer\",\"content\":\"%s\",\"content_type\":\"text\"}\n\n", escapeJSON(string(char)))
		w.(http.Flusher).Flush()

		// 随机延迟,模拟人类打字速度
		time.Sleep(time.Millisecond * time.Duration(50+(char%100)))
	}

	// 发送结束标志
	fmt.Fprint(w, "event: done\ndata: [DONE]\n\n")
	w.(http.Flusher).Flush()

	log.Printf("[MOCK SUCCESS] 模拟回复完成,共输出 %d 个字符", len(fullResponse))
}

// 简单 JSON 转义函数
func escapeJSON(s string) string {
	s = strings.ReplaceAll(s, "\\", "\\\\")
	s = strings.ReplaceAll(s, "\"", "\\\"")
	s = strings.ReplaceAll(s, "\n", "\\n")
	s = strings.ReplaceAll(s, "\r", "\\r")
	return s
}
使用方法
  1. 保存为 mock_coze.go
  2. 运行:
bash 复制代码
go run mock_coze.go
  1. 前端保持原有调用方式(URL 指向 http://localhost:8680/coze-chat 即可)
自定义回复内容

只需修改 fullResponse 变量中的文本,支持任意 Markdown 格式。例如想测试负面评价:

go 复制代码
fullResponse := "这件帽衫不太行,颜色暗沉、版型臃肿,建议再看看其他款~"

或者测试超长回复、代码块、列表等,都可以随意发挥。

总结

这个小工具极大提升了前端开发效率:

  • 零成本、无限测试
  • 完全还原真实流式体验
  • 内容、速度可控
  • 支持前后端联调

推荐所有在做 Coze Bot 前端交互的同学都备一个,调试 UI、加载状态、打字动画时简直无敌好用!

相关推荐
kiros_wang2 小时前
网络状态监听&WiFi信息获取:弱网提示、断网兜底方案
开发语言·网络·php
geovindu2 小时前
rust: pool Pattern (续)
开发语言·后端·设计模式·rust·对象池简写模式
一条泥憨鱼2 小时前
拦截器与过滤器:一次请求穿过 Spring 时,会先经过谁呢
java·开发语言·后端·spring
晴天的雨.9922 小时前
【C++】 priority_queue知识点总结
开发语言·数据结构·c++
郑州光合科技余经理2 小时前
本地生活服务系统:预约状态和进度通知接口怎么拆
java·开发语言·前端·javascript·后端·php·生活
AIFQuant2 小时前
Python港股实时行情API接入:恒生股票数据获取与AH股溢价监控实战
开发语言·数据库·python·金融·实时数据api
外收内放2 小时前
Python基础语法练习题(70)
开发语言·python
Joy T8 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
专注仿真11 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes11 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php