Go语言实现一个Http Server框架(一) http库的使用
作者:upper 时间:2024-02-19 23:25:34
http库的使用
要实现一个httpServer,首先我们需要先了解一下go语言的原生http库,通常会用到的包括以下几个内容:
Body和GetBody
URL
Method
Header
Form
Body和GetBody
Body一般用于获取请求体,但是他有一个问题,因为Body本身是一个流,所以只能读一次,这也就意味着,如果我们有重复读取Body的需要,就必须手动进行处理否则程序会出问题
func readBodyOnce(w http.ResponseWriter, r *http.Request) {
body, err := io.ReadAll(r.Body)
if err != nil {
fmt.Fprintf(w, "read body failed: %v", err)
// 记住要返回,不然就还会执行后面的代码
return
}
// 类型转换,将 []byte 转换为 string
fmt.Fprintf(w, "read the data: %s \n", string(body))
// 尝试再次读取,啥也读不到,但是也不会报错
body, err = io.ReadAll(r.Body)
if err != nil {
// 不会进来这里
fmt.Fprintf(w, "read the data one more time got error: %v", err)
return
}
fmt.Fprintf(w, "read the data one more time: [%s] and read data length %d \n", string(body), len(body))
}
GetBody原则上是允许重复读取的,但是它会返回一个nil,一般用于处理客户端请求,详情参考官方文档 在服务端处理请求的时候,不建议使用
func getBodyIsNil(w http.ResponseWriter, r *http.Request) {
if r.GetBody == nil {
fmt.Fprint(w, "GetBody is nil \n")
} else {
fmt.Fprintf(w, "GetBody not nil \n")
}
}
URL
Request.URL.Query
用于获取queryParam,所有的值在获取到的时候都是字符串,因此拿到参数后需要自行处理
func queryParams(w http.ResponseWriter, r *http.Request) {
values := r.URL.Query()
fmt.Fprintf(w, "query is %v\n", values)
}
Request.URL
包含request请求中一些有用的信息,但是不一定都有,实际使用时需要做一下校验
Request.URL里的HOST不一定有值
Request.Host一般有值
RawPath也不一定有值
Path肯定有值
Header
用于获取请求头
func header(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "header is %v\n", r.Header)
}
Method
用于获取请求方法
func method(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Method is %v\n", r.Method)
}
Form
用于处理formData,在使用时要先调用ParseForm,请求头建议加上:Content-Type: application/x-www-form-urlencoded,因为某些原因还无法处理multipart/form-data
来源:https://juejin.cn/post/7226619773374709819
标签:Go,Server框架,Http,http库
0
投稿
猜你喜欢
python去除列表中的空值元素实战技巧
2023-12-08 12:16:06
python 实现自动远程登陆scp文件实例代码
2022-04-02 20:25:31
Python中的index()方法使用教程
2023-05-13 20:02:31
jquery实现点击页面计算点击次数
2024-04-16 10:33:17
用unescape反编码得出汉字示例
2024-04-19 09:48:52
Python中的groupby分组功能的实例代码
2021-09-17 20:48:15
利用Python提取PDF文本的简单方法实例
2023-05-09 05:37:34
python列表推导和生成器表达式知识点总结
2021-09-13 00:13:42
python如何利用cv2.rectangle()绘制矩形框
2021-03-14 10:12:51
OpenCV-Python实现图像梯度与Sobel滤波器
2021-04-07 05:23:20
教你如何使用Python开发一个钉钉群应答机器人
2023-08-03 17:44:16
在 git 中取消 __pycache__ 文件的方法
2022-09-14 20:00:17
python3 pandas 读取MySQL数据和插入的实例
2024-01-22 06:21:33
让网站容易被发现
2009-04-20 20:35:00
python实现最长公共子序列
2023-06-14 20:53:42
golang使用json格式实现增删查改的实现示例
2024-04-27 15:36:51
wireshark捕获过滤器语法使用解析
2022-04-24 04:52:53
超半数中文网页一年内将“消失”
2008-03-08 12:49:00
一文带你吃透Python中的os和sys模块
2022-01-04 20:42:55
MySQL数据库学习之去重与连接查询详解
2024-01-20 19:16:16