Files
deploy.stack/mcpTimeServer/mcp_client_example.go

190 lines
4.5 KiB
Go
Raw Normal View History

package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)
// 这里使用通用的map类型表示请求和响应避免与main.go中的结构体冲突
func main() {
// 服务器地址
serverURL := "http://localhost:8080"
// 1. 测试健康检查
testHealthCheck(serverURL)
// 2. 测试获取当前时间(默认格式)
testGetCurrentTime(serverURL, "")
// 3. 测试获取当前时间(自定义格式)
testGetCurrentTime(serverURL, "2006-01-02 15:04:05")
// 4. 测试订阅时间流
testSubscribeTimeStream(serverURL)
}
// 测试健康检查
func testHealthCheck(serverURL string) {
url := fmt.Sprintf("%s/health", serverURL)
resp, err := http.Get(url)
if err != nil {
fmt.Printf("健康检查请求失败: %v\n", err)
return
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusOK {
fmt.Println("✅ 健康检查成功: 服务器正常运行")
} else {
fmt.Printf("❌ 健康检查失败: 状态码 %d\n", resp.StatusCode)
}
}
// 测试获取当前时间
func testGetCurrentTime(serverURL string, format string) {
url := fmt.Sprintf("%s/mcp/v1/submit", serverURL)
// 构建请求体
requestBody := map[string]interface{}{
"data": map[string]interface{}{},
"type": "get_current_time",
"timestamp": time.Now().Unix(),
}
// 添加格式参数(如果提供)
if format != "" {
data := requestBody["data"].(map[string]interface{})
data["format"] = format
}
// 序列化请求体
jsonData, err := json.Marshal(requestBody)
if err != nil {
fmt.Printf("序列化请求体失败: %v\n", err)
return
}
// 发送POST请求
resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
if err != nil {
fmt.Printf("发送请求失败: %v\n", err)
return
}
defer resp.Body.Close()
// 读取响应
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
return
}
// 解析响应为map
var response map[string]interface{}
if err := json.Unmarshal(body, &response); err != nil {
fmt.Printf("解析响应失败: %v\n", err)
return
}
// 检查响应状态
success, ok := response["success"].(bool)
if !ok || !success {
message := "未知错误"
if msg, ok := response["message"].(string); ok {
message = msg
}
fmt.Printf("❌ 获取当前时间失败: %s\n", message)
return
}
// 提取数据
data, ok := response["data"].(map[string]interface{})
if !ok {
fmt.Println("❌ 响应数据格式错误")
return
}
// 获取时间信息
currentTime, _ := data["current_time"].(string)
timestamp, _ := data["timestamp"].(float64)
fmt.Printf("✅ 获取当前时间成功 (格式: %s):\n", format)
fmt.Printf(" 时间: %s\n", currentTime)
fmt.Printf(" 时间戳: %.0f\n", timestamp)
}
// 测试订阅时间流
func testSubscribeTimeStream(serverURL string) {
url := fmt.Sprintf("%s/mcp/v1/submit", serverURL)
// 构建请求体
requestBody := map[string]interface{}{
"data": map[string]interface{}{
"interval": 2, // 每2秒更新一次
"format": "2006-01-02 15:04:05",
},
"type": "subscribe_time_stream",
"timestamp": time.Now().Unix(),
}
// 序列化请求体
jsonData, err := json.Marshal(requestBody)
if err != nil {
fmt.Printf("序列化请求体失败: %v\n", err)
return
}
// 发送POST请求
resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
if err != nil {
fmt.Printf("发送请求失败: %v\n", err)
return
}
defer resp.Body.Close()
// 读取响应
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
return
}
// 解析响应为map
var response map[string]interface{}
if err := json.Unmarshal(body, &response); err != nil {
fmt.Printf("解析响应失败: %v\n", err)
return
}
// 检查响应状态
success, ok := response["success"].(bool)
if !ok || !success {
message := "未知错误"
if msg, ok := response["message"].(string); ok {
message = msg
}
fmt.Printf("❌ 订阅时间流失败: %s\n", message)
return
}
// 提取数据
data, ok := response["data"].(map[string]interface{})
if !ok {
fmt.Println("❌ 响应数据格式错误")
return
}
// 获取流信息
streamID, _ := data["stream_id"].(string)
sseURL, _ := data["sse_url"].(string)
interval, _ := data["interval"].(float64)
fmt.Printf("✅ 订阅时间流成功:\n")
fmt.Printf(" 流ID: %s\n", streamID)
fmt.Printf(" SSE URL: %s\n", sseURL)
fmt.Printf(" 更新间隔: %.0f秒\n", interval)
fmt.Println(" 提示: 可以使用curl或浏览器访问SSE URL来接收实时时间更新")
}