Go 学习笔记(78)— Go 标准库 net/http 创建服务端(接收 GET、POST 请求)

news/2024/11/15 4:35:33/

使用 net/http 标准库创建一个 httprestful api 的服务端,用来处理 GETPOST 等请求。

源代码如下:

package mainimport ("encoding/json""fmt""net""net/http""strconv""time"
)type Contact struct {Home string `json:"home"`Cell string `json:"cell"`
}type Student struct {Name    string  `json:"name"`Year    string  `json:"year"`Contact Contact `json:"contact"`
}// 任务的HTTP接口
type ApiServer struct {httpServer *http.Server
}// HTTP接口应答
type Response struct {Errno int         `json:"errno"`Msg   string      `json:"msg"`Data  interface{} `json:"data"`
}// 构造一个响应
func BuildResponse(errno int, msg string, data interface{}) ([]byte, error) {// 1, 定义一个responseresponse := &Response{Errno: errno,Msg:   msg,Data:  data,}// 2, 序列化jsonresp, err := json.Marshal(response)return resp, err
}func saveFunction(resp http.ResponseWriter, req *http.Request) {// 1, 解析 POST 表单err := req.ParseForm()if err != nil {fmt.Printf("ParseForm error: %s\n", err)}// 获取表单中所有字段内容fmt.Printf("req.PostForm is %v", req.PostForm)// 2, 取表单中的 name 字段name := req.PostForm.Get("name")fmt.Printf("name: %s\n", name)contactInfo := req.PostForm.Get("contact")fmt.Printf("contactInfo: %s\n", contactInfo)// 3, 反序列化jobvar contact Contacterr = json.Unmarshal([]byte(contactInfo), &contact)fmt.Printf("contact: %s\n", contact)if err != nil {fmt.Printf("Unmarshal error: %s\n", err)}// 4, 保存到数据库// saveToDB()// 5, 返回正常应答 ({"errno": 0, "msg": "", "data": {....}})bytes, err := BuildResponse(0, "success", contact)if err == nil {resp.Write(bytes)}
}func listFunction(resp http.ResponseWriter, req *http.Request) {// 1. 解析GET参数err := req.ParseForm()if err != nil {fmt.Printf("ParseForm error: %s\n", err)}// 2. 获取请求参数 /api/list?name=wohuname := req.Form.Get("name")fmt.Printf("name: %s\n", name)// 3. 从数据库中读取对应的字段值后显示// ret := queryDB()// 4. 返回正常应答 ({"errno": 0, "msg": "", "data": {....}})bytes, err := BuildResponse(0, "success", name)if err == nil {resp.Write(bytes)}
}// 初始化服务
func InitApiServer() (err error) {// 配置路由mux := http.NewServeMux()mux.HandleFunc("/api/save", saveFunction)// mux.HandleFunc("/api/del", delFunction)// mux.HandleFunc("/api/update", updateFunction)mux.HandleFunc("/api/list", listFunction)// 启动TCP监听listener, err := net.Listen("tcp", ":"+strconv.Itoa(8070))if err != nil {return}// 创建一个HTTP服务httpServer := &http.Server{ReadTimeout:  100 * time.Millisecond,WriteTimeout: 100 * time.Millisecond,Handler:      mux,}// 启动了服务端go httpServer.Serve(listener)return
}func main() {InitApiServer()// 正常退出for {time.Sleep(1 * time.Second)}
}

然后使用 Postman 工具发送 GETPOST 请求:

POST请求


http://www.ppmy.cn/news/603210.html

相关文章

十九、数据选择

常规的数据选择主要有列选择、行选择、行列同时选择三种方式。 一、列选择 1、选择某一列/某几列 (1)Excel实现 在Excel中选择某一列直接用鼠标选中这一列即可:如果要同时选择多列,且待选择的列不是相邻的,这个时候…

Go 学习笔记(79)— Go 标准库 net(获取本机IP地址)

1. 获取本机 IP 地址 package mainimport ("fmt""net" )// 获取本机网卡IP func getLocalIP() (ipv4 string, err error) {// var (// addrs []net.Addr// addr net.Addr// ipNet *net.IPNet // IP地址// isIpNet bool// )// 获取所有网卡addrs, err …

etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语

1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discovery. 即一个用于配置共享和服务发现的键值存储系统。 etcd 是一款分布式存储中间件,使用 Go 语言编写,并通过 Raft 一致性算…

etcd 笔记(02)— etcd 安装(apt 或 yum 安装 、二进制包安装、Docker 安装 etcd、etcd 前端工具 etcdkeeper、etcdv3-browser)

1. 使用 apt 或 yum 安装 etcd 命令如下: sudo apt-get install etcd或者 sudo yum install etcd这样安装的缺点是:安装的 etcd 版本过低为 2.2.5,该版本使用 Go 的版本为 1.6 如下所示: wohuubuntu-dev:~$ etcd 2021-04-17 0…

etcd 笔记(03)— etcd 客户端使用(键值的增、删、改、查)、watch监测键、lease使用(创建租约、撤销租约、刷新租期、查询租期)

1. etcd 客户端 etcdctl 是一个命令行客户端,便于我们进行服务测试或手动修改数据库内容,etcdctl 在两个不同的 etcd 版本(v2 和 v3)下的功能和使用方式也完全不同。 一般通过如下方式来指定使用 etcd 的版本: expo…

etcd 笔记(04)— etcd 网关与 gRPC 网关

1. etcd 网关 etcd 网关是一个简单的 TCP 代理,可将网络数据转发到 etcd 集群。网关是无状态且透明的,它既不会检查客户端请求,也不会干扰集群响应,支持多个 etcd 服务器实例,并采用简单的循环策略。 etcd 网关将请求…

etcd 笔记(05)— etcd 代码结构、各模块功能、整体架构、各模块之间的交互、请求和应答流程

1. etcd 项目结构和功能 etcd 项目代码的目录结构如下: $ tree ├── auth ├── build ├── client ├── clientv3 ├── contrib ├── embed ├── etcdctl ├── etcdmain ├── etcdserver ├── functional ├── hack ├── integration ├─…

etcd 笔记(06)— Client 结构定义、客户端(初始化、KV存储Get、Put、事务 Txn、压缩 Compact、Watch、Lease

1. Client 定义 Client 定义如下: type Client struct {ClusterKVLeaseWatcherAuthMaintenance// 认证的用户名Username string// 认证的密码Password string }这里显示的都是可导出的模块结构字段,代表了客户端能够使用的几大核心模块,具体…