forked from DevOps/deploy.stack
190 lines
4.5 KiB
Go
190 lines
4.5 KiB
Go
|
|
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来接收实时时间更新")
|
|||
|
|
}
|