Go语言实现一个Http Server框架(一) http库的使用
作者:upper 发布时间:2024-02-19 23:25:34
标签:Go,Server框架,Http,http库
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


猜你喜欢
- Basemap是matplotlib子包,也是python中最常用、最方便的地理数据可视化工具之一。在中端输入pip list先查看是否有j
- 从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返
- 实训课期间忙里偷闲的学习了python的selenium包,唯一一点不好是要自己去查英文文档,明摆着欺负我这种英语不好的,想着用谷歌翻译一下
- 代码如下,另存为asp文件,请传到你的服务器上就可以了马上测一下<%Response.Expires = 0Response.Expi
- 0x00 环境系统环境:win10编写工具:JetBrains PyCharm Community Edition 2017.1.2 x64
- 即以游客身份登录网站时以cookie的方式存储购物车,而以登录用户的身份进入时将购物车信息存储到数据库中去,若是先以游客身份完成购物再登录继
- /1 前言/最近酒店被曝出隐藏摄像头的事情屡见不鲜,搞得大家人心惶惶,有图为证,如下图所示。今天教大家一下如何用python分析出酒店里的针
- 一、添加user到group第一种:user.groups.add(1) # add by id第二种:from django.contri
- 一、简介shutil是 python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建、删除、查看等方法,还
- 本文实例为大家分享了python通过实例方法名字调用方法的具体代码,供大家参考,具体内容如下案例: &nb
- 1 简介DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。或许说它可能有点像matlab的矩
- 合并两个没有共同列的dataframe,相当于按行号求笛卡尔积。最终效果如下以下代码是参考别人的代码修改的:def cartesian_df
- 本文实例讲述了Python操作json的方法。分享给大家供大家参考,具体如下:python中对json操作方法有两种,解码loads()和编
- 配置 thriftpython使用的包 thrift个人使用的python 编译器是pycharm community edition. 在
- 引擎简介Innodb引擎Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束
- 音乐流媒体服务的兴起使得音乐无处不在。我们在上下班的时候听音乐,锻炼身体,工作或者只是放松一下。这些服务的一个关键特性是播放列表,通常按流派
- 前言通过pandas的使用,我们经常要交互式地展示表格(dataframe)、分析表格。而表格的格式就显得尤为重要了,因为大部分时候如果我们
- 一. 访问WEB数据库的多种方案目前在WINDOWS环境下有多种访问WEB数据库的技术,主要有:1.公共网关接口CGI(Commo
- 实例如下所示:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition
- Smarty Smarty的特点是将模板编译成PHP脚本,然后执行这些脚本。很快,非常灵活。 Heyes Template&nbs