一、WebSocket服务端示例(Golang实现)
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true // 生产环境需配置域名白名单
},
}
type StockRequest struct {
CountryID int `json:"countryId"`
PageSize int `json:"pageSize"`
Page int `json:"page"`
Key string `json:"key"` // 建议通过环境变量注入正式KEY
}
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("WebSocket升级失败:", err)
return
}
defer conn.Close()
for {
_, message, err := conn.ReadMessage()
if err != nil {
break
}
var req StockRequest
if err := json.Unmarshal(message, &req); err != nil {
conn.WriteJSON(map[string]string{"error": "无效的JSON格式"})
continue
}
// 密钥验证(演示用临时KEY)
if req.Key == "" || req.Key == "临时KEY" {
conn.WriteJSON(map[string]string{
"warning": "请通过官方渠道申请免费API KEY",
"contact": "support@stocktv.top",
})
continue
}
// 模拟返回股票数据(实际应调用原API)
response := map[string]interface{}{
"code": 200,
"data": []map[string]interface{}{
{
"id": 41602,
"chg": 0.12,
"symbol": "MDCH",
"volume": 1241700,
},
},
}
if err := conn.WriteJSON(response); err != nil {
log.Println("数据发送失败:", err)
break
}
}
}
func main() {
http.HandleFunc("/ws/stocks", wsHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
二、WebSocket客户端示例(JavaScript)
const socket = new WebSocket('ws://localhost:8080/ws/stocks');
// 连接建立时发送请求参数
socket.onopen = function() {
const request = {
countryId: 42, // 东南亚国家代码
pageSize: 10,
page: 1,
key: 'MY4b781f618e3f43c4b055f25fa61941ad' // 此处使用临时KEY
};
socket.send(JSON.stringify(request));
};
// 接收实时数据
socket.onmessage = function(event) {
const response = JSON.parse(event.data);
if(response.warning) {
console.warn('⚠️ ' + response.warning);
console.log('联系方式:', response.contact);
return;
}
if(response.code === 200) {
response.data.forEach(stock => {
console.log(`股票 ${stock.symbol} 最新价: ${stock.last}`);
// 更新前端图表逻辑...
});
}
};
// 错误处理
socket.onerror = function(error) {
console.error('连接异常:', error);
};
三、关键功能说明
-
密钥管理机制
- 服务端会验证
key
参数有效性,无效KEY返回官方申请提示 - 建议通过环境变量注入正式KEY(生产环境需删除临时KEY逻辑)
- 服务端会验证
-
数据推送模式
- 支持双向通信,服务端可主动推送市场异动数据
- 客户端可发送新的
countryId
参数切换国家数据源
-
性能优化建议
// 服务端可添加速率限制(示例为无限制) conn.SetReadLimit(512) // 限制单次消息大小 conn.SetReadDeadline(time.Now().Add(60 * time.Second))
四、获取正式API KEY
- 访问股票数据平台官网
- 点击"开发者中心"注册账号
- 在控制台创建新应用获取唯一API KEY
- 免费版支持特性:
- 东南亚5国+日本市场数据
- 每秒10次请求限制
- 基础技术指标数据
注意:本示例中的
MY4b781f618e3f43c4b055f25fa61941ad
为临时测试KEY,正式环境请通过官方渠道申请,避免出现401 Unauthorized
错误。