Go 学习笔记(78)— Go 标准库 net/http 创建服务端(接收 GET、POST 请求)
使用 net/http
标准库创建一个 http
的 restful api
的服务端,用来处理 GET
、POST
等请求。
源代码如下:
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
工具发送 GET
、POST
请求:
Go 学习笔记(78)— Go 标准库 net/http 创建服务端(接收 GET、POST 请求)相关推荐
- python基础教程_学习笔记14:标准库:一些最爱——re
标准库:一些最爱 re re模块包括对正則表達式的支持,由于以前系统学习过正則表達式,所以基础内容略过,直接看python对于正則表達式的支持. 正則表達式的学习,见<Mastering Reg ...
- python基础课程_学习笔记13:标准库:有些收藏夹——sys
标准库:有些收藏夹 sys sys这个模块可以让你访问和python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描写叙述 argv 命令行參数,包含脚本名称 exit( ...
- Python学习笔记: Python 标准库概览二
本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python 简介 Python流程介绍:深入Python 流程 Python数据结构 ...
- Python学习笔记: Python 标准库概览
本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python 简介 Python流程介绍:深入Python 流程 Python数据结构 ...
- 华为帐号服务学习笔记(四):Authorization Code模式服务端开发
笔者在<华为帐号服务学习笔记(二):OAuth2.0协议详解>中已经给大家介绍了Authorization Code模式是需要有后台服务器才能使用的,并且在<华为帐号服务学习笔记(三 ...
- Python学习笔记17:标准库之数学相关(math包,random包)
前面几节看得真心累.如今先来点简单easy理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e # 自然常数e math.pi # 圆周率pi 运算函数 math ...
- Python学习笔记14:标准库之信号量(signal包)
signal包负责在Python程序内部处理信号.典型的操作包含预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等. 要注意,signal包主要是针对UNIX平台(比方Linux, MAC ...
- 学习笔记(08):Python网络编程并发编程-实现服务端可以对多个客户端提供服务
立即学习:https://edu.csdn.net/course/play/24458/296237?utm_source=blogtoedu 链接循环,一个服务器服务多个客户端, 思路1:服务器一个 ...
- Javaweb学习笔记(JSP标准标签库)
Javaweb学习笔记(JSP标准标签库) JSTL入门 安装和测试JSTL JSTL中的Core标签库 < c:out>标签 标签 标签 < c:catch>标签 标签 标签 ...
最新文章
- 使用HtmlGenericControl控件动态产生一些HtmlControls
- MySQL 高级 - 存储过程 - 语法 - if判断 || 传递参数 (IN - 输入 OUT-输出)
- 2020-10-30(APK-逆向2)
- 学习网站分享 - 菜鸟教程
- c++: internal compiler error: Killed
- mysql修改字段结构_MySQL修改表结构及其添加删除修改字段功能
- Xcode连接git@osc
- PHP安装教程及相关说明
- datax因为脏数据降速问题解决
- IAR 8.50.9破解后,遇到IarIdePm Encoutered an improper argument错误记录
- 电气线材选型入门(rv、rvv、rvvp、avvr、蓝白排线等)
- 卫星导航信号结构变化的过去,现在和未来
- C# DataGridView 冻结列或行
- 【科技素养题】少儿编程 蓝桥杯青少组科技素养题真题及解析第16套
- 查看CAD图纸文件时如何平移查看?
- 微信语音怎么保存 微信语音导出文件夹教程
- Linux运维基础进阶——PPT汇总
- 最小割与最大流(mincut maxflow)
- 软件智能的大致呈现---aaas系统预期
- 家庭网络文件共享的几种方式