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
0
投稿
猜你喜欢
- 读取十万多条文本写入SQLite类型数据库,由于文本中存在中文字符,插入到数据库没错,取出时一直是UnicodeDecodeError,导致
- 昨天翻硬盘,找到一个好东西,可惜自己加了密码自己不记得了。试了几个常用的没试出来,于是写了这么个小脚本来替我尝试。。呵呵,还真给解出来了。p
- 1、MFCC概述在语音识别(Speech Recognition)和话者识别(Speaker Recognition)方面,最常用到的语音特
- 实验环境:python版本3.9Python 3.9.7 (tags/v3.9.7:1016ef3, Aug 30 2021, 20:19:
- GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想你用了GROUP BY 按
- 前言:正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来
- MySQL的Explain命令用于查看执行效果。虽然这个命令只能搭配select类型语句使用,如果你想查看update,delete类型语句
- 1、文件和文件组的含义与关系 每个数据库有一个主数据文件.和若干个从文件。文件是数据库的物理体现。 文件组可以包括分布在多个逻辑分区的文件,
- 1、现象a.用localhost访问,正常b.用IP地址访问,则出现403错误2、分析a.怀疑是ACL问题,设置Everyone为完全控制,
- 利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的。1、创建保存备份文件的路径/mysqldata#mkdi
- 引言:以前写的一个批量xls转csv的python简单脚本,用的是python2.7#coding=utf-8import osimport
- def bytes_to_human(n): symbols = ('K','M','G
- 彩色圆环更漂亮A.课程内容通过绘制彩色的圆环来学习列表的使用方法、颜色的使用技巧等,通过学习掌握python程序绘制彩色的图形的方法。B.知
- 在这个自动化时代,我们有很多重复无聊的工作要做。 想想这些你不再需要一次又一次地做的无聊的事情,让它自动化,让你的生活更轻松。 那么在本文中
- 1、切片使用切片来实现列表的倒序排序,mylist[start:end:step],不改变原列表。#!/usr/bin/env python
- 链接中的例子是一些脚本攻击相关的内容,有时间的朋友可以点开看看。 1.不要相信Request.QueryString: 相信在asp时代,这
- 如下所示:>>> import pandas as pd>>> import numpy as np&g
- 目前绝大多数手机都支持WAP 2.0。WAP 2.0的页面设计具有更好的视觉效果,更接近网页。不过由于手机千差万别,手机浏览器的能力也各不相
- python拼接字符串一般有以下几种方法:①直接通过(+)操作符拼接s = 'Hello'+' '+'
- 当今越来越多的应用程序迁移到web平台上。由于没有平台的限制和安装的要求,SAAS的模式看起来非常有吸引力。Web应用程序的界面设计,其核心