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"
      }
    ]
  }
}

在这里插入图片描述

Logo

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

更多推荐