前几天心血来潮想要用Go来进行web服务的搭建,并把现有能够在Go上实现的功能搬到Go,进行了多次尝试,总算把Python中的部分功能在Go上能够跑通。简单介绍一下实现流程,以便不时之需。
下载并使用gin框架
Go中web框架也有许多,这里我使用的是gin框架进行web项目的搭建。
$ go get -u github.com/gin-gonic/gin
再在项目中进行import
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"goWebDemo/handler"
"goWebDemo/routers"
)
在main函数中进行gin类的初始化创建,并可以添加黑名单或者白名单路径。myHandler中是进行黑、白名单设置。r.Run可以进行端口的设置。
func myHandler() gin.HandlerFunc {
return func(c *gin.Context) {
if c.Request.URL.Path == "/" {
fmt.Print("阻止")
c.JSON(0, "fail")
c.Abort()
return
}
fmt.Println("放行")
c.Next()
}
}
func main() {
r := gin.Default()
r.Use(myHandler())
err := r.Run(":9000")
if err != nil {
return
}
}
路由分组
新建一个类,group中写入路由组名称,在组内添加Post、Get等方法。现在的路径就变成了localhost:9000/chat/xxxx
func ChatRouterInit(engine *gin.Engine) {
group := engine.Group("/chat")
{
group.POST("/create", createHandler)
group.POST("/talk", talkHandler)
group.GET("/conclude", concludeHandler)
}
}
获取POST传来的json
创建一个struct类来进行json数据的接收,json:后面就是参数名称,可在后面添加要求,比如必传可以用binding:"required",默认值用default:"xxxx" ,如下Gender 就是必传值,Kind_of有默认值xxx。
type Features struct {
Gender string `json:"gender" binding:"required"`
Kind_of string `json:"kind_of" default:"xxx"`
Vaccinated string `json:"vaccinated"`
Deworming string `json:"deworming"`
}
然后在方法中使用创建的struct类进行接收。这样post中的参数就能接收到了。
func createHandler(c *gin.Context) {
//创建一个struct类
var features Features
//进行json数据的接收
err := c.ShouldBindJSON(&features)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "data": "传入参数错误"})
return
fmt.Println(features)
}
使用Go连接智谱AI进行回答
由于智谱AI官网没有Go语言的连接Demo,所以查看python、java连接进行参考
func GetResponse(inputFeatures []map[string]string) string {
//添加自定义的prompt
var prompt map[string]interface{}
prompt = make(map[string]interface{})
//选择使用的大语言模型
prompt["model"] = "glm-4"
//添加参数
prompt["messages"] = inputFeatures
prompt["temperature"] = 0.7
prompt["top_p"] = 0.8
marshal, _ := json.Marshal(prompt)
targetUrl := "https://open.bigmodel.cn/api/paas/v4/chat/completions"
client := &http.Client{}
req, _ := http.NewRequest("POST", targetUrl, bytes.NewReader(marshal))
req.Header.Add("Authorization", "Bearer "+"自己的AccessToken")
req.Header.Add("Content-Type", "application/json")
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var result map[string][]map[string]map[string]string
result = make(map[string][]map[string]map[string]string)
json.Unmarshal(body, &result)
i := result["choices"][0]["message"]["content"]
return i
//result = string(body)
//return string(body)
}
以上就是Go语言gin框架下web服务的搭建过程。