go语言SSE客户端

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/r3labs/sse/v2"
	"net/http"
	"net/url"
	"strings"
)

func main() {
	r := gin.Default()
	r.Use(func(c *gin.Context) {
		c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
		c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
		c.Writer.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
	})

	r.POST("/stream", ChatGPTSSE)
	r.Run(":8080")
}

func ChatGPTSSE(c *gin.Context) {
	fmt.Println("开始调用")
	c.Status(http.StatusOK)
	c.Header("Content-Type", "text/event-stream")
	c.Writer.Flush()
	client := &http.Client{
		// 设置Transport字段为自定义Transport,包含代理设置
		Transport: &http.Transport{
			Proxy: func(req *http.Request) (*url.URL, error) {
				// 设置代理
				proxyURL, err := url.Parse("http://127.0.0.1:7890")
				if err != nil {
					return nil, err
				}
				return proxyURL, nil
			},
		},
	}
	// 创建 SSE 客户端
	sseClient := sse.NewClient("https://api.openai.com/v1/chat/completions")
	sseClient.Connection = client
	// 设置请求体
	reqBody := strings.NewReader(`{"model": "gpt-3.5-turbo","messages": [{"role": "user", "content": "你的版本是多少"}],"stream": true}`)
	sseClient.Body = reqBody
	sseClient.Method = "POST"
	headers := make(map[string]string)
	headers["Authorization"] = "Bearer YOUR_TOKEN"
	headers["Content-Type"] = "application/json"
	sseClient.Headers = headers

	// 监听 SSE 事件
	err := sseClient.SubscribeRaw(func(msg *sse.Event) {
		fmt.Printf("Received event: %v\n", string(msg.Data))
		fmt.Fprintf(c.Writer, "data: %s\n\n", string(msg.Data))
		c.Writer.Flush()
	})
	if err != nil {
		return
	}
	fmt.Println("结束调用")
}
posted @   老卫同学  阅读(1651)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
主题色彩