Go 启动 HTTP 服务接收 post 请求响应数据
Go 启动 HTTP 服务接收 post 请求响应数据
·
Go 启动 HTTP 服务接收 post 请求响应数据
package main
import (
"encoding/json"
"errors"
"io/ioutil"
"log"
"net/http"
"runtime/debug"
)
type HttpServer struct {
server *http.Server // 表示一个HTTP服务器
IsRunning bool // 指示服务器是否正在运行
}
type ResMsg struct {
Code string `json:"code"` // 响应代码
Data interface{} `json:"data"` // 响应数据
}
type CommonMsg struct {
Code string `json:"code"` // 通用消息代码
Data NotifyMsg `json:"data"` // 通用消息数据
}
type User struct {
UserID string `json:"userId"` // 用户ID
UserName string `json:"userName"` // 用户名
UserCode string `json:"userCode"` // 用户代码
OrgName string `json:"orgName"` // 组织名称
OrgCode string `json:"orgCode"` // 组织代码
UapToken string `json:"uap_token"` // UAP令牌
ExpiresIn string `json:"expiresIn"` // 令牌过期时间
}
type List struct {
AppCode string `json:"appCode"` // 应用代码
AppName string `json:"appName"` // 应用名称
AppURL string `json:"appUrl"` // 应用URL
}
type NotifyMsg struct {
User User `json:"user"` // 用户信息
List []List `json:"list"` // 应用列表
}
var httpServer HttpServer
func NotifytUserInfo(w http.ResponseWriter, req *http.Request) {
defer func() {
if r := recover(); r != nil {
/*
debug.Stack() 是 Go 语言标准库中的一个函数,
用于返回当前 goroutine 的调用栈信息。
它返回一个表示调用栈的字节切片,
其中包含了调用栈上每个函数调用的信息,包括函数名、文件名、行号等。
*/
log.Printf("SYSTEM ACTION PANIC: %v, stack: %v", r, string(debug.Stack()))
}
}()
var res ResMsg
var msg CommonMsg
var err = errors.New("only support POST")
if req.Method == "POST" {
log.Println("NotifytUserInfo enter")
/*
ioutil.ReadAll() 是 Go 标准库中的一个函数,
用于从一个可读取对象(如文件或网络连接)中读取所有的数据,
并将其作为字节切片返回。
*/
body, _ := ioutil.ReadAll(req.Body)
err = json.Unmarshal(body, &msg)
if err == nil {
// Handle the received data here
// ...
res.Code = "200"
res.Data = "success"
resstr, _ := json.Marshal(res)
w.Write(resstr)
return
}
res.Code = "500"
res.Data = err.Error()
resstr, _ := json.Marshal(res)
/*
Write 方法用于将数据写入 HTTP 响应的主体(response body)
这行代码的作用是将 JSON 格式的响应内容(存储在 resstr 中)作为响应的主体部分,
发送给发起 HTTP 请求的客户端。
*/
w.Write(resstr)
return
}
res.Code = "405"
res.Data = err.Error()
resstr, _ := json.Marshal(msg)
w.Write(resstr)
}
// 启动 HTTP 服务器
func startHttpServer(ip, port string) {
if httpServer.IsRunning {
return
}
httpServer.IsRunning = true
http.HandleFunc("/notifytUserInfo", NotifytUserInfo)
httpServer.server = &http.Server{Addr: ip + ":" + port, Handler: nil}
err := httpServer.server.ListenAndServe()
if err != nil {
log.Println("Failed to start HTTP server!")
}
}
func main() {
ip := "127.0.0.1"
port := "8080"
startHttpServer(ip, port)
}
http://127.0.0.1:8080/notifytUserInfo
{
"code": "123",
"data": {
"user": {
"userId": "123",
"userName": "John",
"userCode": "ABC",
"orgName": "Org1",
"orgCode": "ORG1",
"uap_token": "token123",
"expiresIn": "2023-06-30"
},
"list": [
{
"appCode": "app1",
"appName": "App1",
"appUrl": "https://example.com/app1"
},
{
"appCode": "app2",
"appName": "App2",
"appUrl": "https://example.com/app2"
}
]
}
}

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)