Go語言快速搭建一個API流式回復(fù)本地模擬接口
在開發(fā) Coze Bot 相關(guān)的前端功能時,我們經(jīng)常需要測試流式回復(fù)(SSE)的打字機效果、加載狀態(tài)、停止響應(yīng)、內(nèi)容渲染等邏輯。但直接調(diào)用真實的 Coze API 會消耗 token,而且回復(fù)速度和內(nèi)容不可控。
下面分享一個純 Go 實現(xiàn)的本地模擬接口,只需幾分鐘就能跑起來,完全兼容 Coze 的 /v3/chat 流式返回格式,讓你零成本、無限次地測試前端體驗。
功能亮點
- 完美還原 Coze 的 SSE 流式結(jié)構(gòu)(
event: conversation.message.delta+data: {"content":"..."}) - 逐字打字機效果,延遲隨機 50~150ms,模擬真人輸入
- 支持 CORS,前端直接調(diào)用無需額外配置
- 回復(fù)內(nèi)容支持 Markdown,前端可直接渲染
- 自動發(fā)送
[DONE]結(jié)束標(biāo)志 - 代碼簡潔,只有不到 100 行
完整代碼(mock_coze.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] 監(jiān)聽地址: 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 預(yù)檢
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
}
// 讀取請求體(僅模擬,可忽略內(nèi)容)
_, _ = io.ReadAll(r.Body)
defer r.Body.Close()
// 設(shè)置 SSE 響應(yīng)頭
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()
// 自定義回復(fù)內(nèi)容(支持 Markdown,隨時修改)
fullResponse := `# 時尚審美評估師
**評判結(jié)果**:好看
**理由**:
- 這件帽衫的深灰色非常百搭,經(jīng)典不過時,適合各種膚色。
- 版型寬松舒適,oversize 設(shè)計很有街頭感,顯瘦又時髦。
- 帽繩和袖口細(xì)節(jié)處理精致,質(zhì)感看起來很不錯(棉感強,不廉價)。
- 前胸的小logo繡標(biāo)低調(diào)有質(zhì)感,不會太張揚。
- 整體風(fēng)格偏休閑運動風(fēng),日常穿搭、約會、逛街都非常合適。
**搭配建議**:
- 下裝:黑色或深藍(lán)牛仔褲 + 白球鞋(經(jīng)典安全)
- 進階:卡其色工裝褲 + 馬丁靴(更有層次)
- 外搭:短款羽絨服或風(fēng)衣(冬天顯高)
總體來說,這件帽衫設(shè)計簡潔大方,性價比應(yīng)該很高,值得入手!?`
// 逐字輸出,模擬打字機效果
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)))
}
// 發(fā)送結(jié)束標(biāo)志
fmt.Fprint(w, "event: done\ndata: [DONE]\n\n")
w.(http.Flusher).Flush()
log.Printf("[MOCK SUCCESS] 模擬回復(fù)完成,共輸出 %d 個字符", len(fullResponse))
}
// 簡單 JSON 轉(zhuǎn)義函數(shù)
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
}
使用方法
保存為 mock_coze.go
運行:
go run mock_coze.go
前端保持原有調(diào)用方式(URL 指向 http://localhost:8680/coze-chat 即可)
自定義回復(fù)內(nèi)容
只需修改 fullResponse 變量中的文本,支持任意 Markdown 格式。例如想測試負(fù)面評價:
fullResponse := "這件帽衫不太行,顏色暗沉、版型臃腫,建議再看看其他款~"
或者測試超長回復(fù)、代碼塊、列表等,都可以隨意發(fā)揮。
總結(jié)
這個小工具極大提升了前端開發(fā)效率:
- 零成本、無限測試
- 完全還原真實流式體驗
- 內(nèi)容、速度可控
- 支持前后端聯(lián)調(diào)
推薦所有在做 Coze Bot 前端交互的同學(xué)都備一個,調(diào)試 UI、加載狀態(tài)、打字動畫時簡直無敵好用!
到此這篇關(guān)于Go語言快速搭建一個API流式回復(fù)本地模擬接口的文章就介紹到這了,更多相關(guān)Go本地模擬接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang try catch與錯誤處理的實現(xiàn)
社區(qū)不少人在談?wù)?nbsp;golang 為毛不用try/catch模式,而采用苛刻的recovery、panic、defer組合,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下2021-07-07
Mac上Go環(huán)境和VS Code的正確安裝與配置方法
Go語言是一個新興的語言。下面介紹一下如何在Mac系統(tǒng)下安裝和使用這個語言,Go語言提供了mac下安裝包,可直接下載安裝包點擊安裝2018-03-03
go開源Hugo站點構(gòu)建三步曲之集結(jié)渲染
這篇文章主要為大家介紹了go開源Hugo站點構(gòu)建三步曲之集結(jié)渲染詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
完美解決go Fscanf 在讀取文件時出現(xiàn)的問題
這篇文章主要介紹了完美解決go Fscanf 在讀取文件時出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Golang 統(tǒng)計字符串字?jǐn)?shù)的方法示例
本篇文章主要介紹了Golang 統(tǒng)計字符串字?jǐn)?shù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05

