golang中的标准库http
Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现。
http客户端
基本的HTTP/HTTPS请求 Get、Head、Post和PostForm函数发出HTTP/HTTPS请求。
resp, err := http.Get("http://5lmh.com/")
...
resp, err := http.Post("http://5lmh.com/upload", "image/jpeg", &buf)
...
resp, err := http.PostForm("http://5lmh.com/form",
url.Values{"key": {"Value"}, "id": {"123"}})
程序在使用完response后必须关闭回复的主体。
resp, err := http.Get("http://5lmh.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...
GET请求示例
使用net/http包编写一个简单的发送HTTP请求的Client端,代码如下:
func main() {
resp, err := http.Get("https://www.liwenzhou.com")
if err != nil {
fmt.Println(err.Error())
return
}
// 使用完response之后必须关闭使用的主体
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(string(body))
}
将上面的代码保存之后编译成可执行文件,执行之后就能在终端打印liwenzhou.com网站首页的内容了,我们的浏览器其实就是一个发送和接收HTTP协议数据的客户端,我们平时通过浏览器访问网页其实就是从网站的服务器接收HTTP数据,然后浏览器会按照HTML、CSS等规则将网页渲染展示出来。
带参数的GET请求示例
关于GET请求的参数需要使用Go语言内置的net/url这个标准库来处理。
- server.go
func main() {
http.HandleFunc("/", SayHello)
if err := http.ListenAndServe(":8000", nil); err != nil {
fmt.Println(err.Error())
return
}
}
func SayHello(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
data := r.URL.Query()
name := data.Get("name")
age := data.Get("age")
fmt.Println(name, age)
answer := `{"status": "ok"}`
w.Write([]byte(answer))
}
- client.go
func main() {
//resp, err := http.Get("http://127.0.0.1:8000")
apiUrl := "http://127.0.0.1:8000"
data := url.Values{} // 类型:type Values map[string][]string
data.Set("name", "张三")
data.Set("age", "18")
u, err := url.ParseRequestURI(apiUrl)
if err != nil {
fmt.Println(err.Error())
return
}
u.RawQuery = data.Encode()
fmt.Println(u.String())
resp, err := http.Get(u.String())
if err != nil {
fmt.Println(err.Error())
return
}
defer resp.Body.Close()
/*
reader := bufio.NewReader(resp.Body)
buf := make([]byte, 1000)
n, _ := reader.Read(buf)
fmt.Println(buf[:n])
*/
// ioutil.ReadAll() 代替了上面这段
buf, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(string(buf))
}
POST请求示例
上面演示了使用net/http包发送GET请求的示例,发送POST请求的示例代码如下:
POST表单请求数据
- server.go
func main() {
http.HandleFunc("/", SayHello)
if err := http.ListenAndServe(":8000", nil); err != nil {
fmt.Println(err.Error())
return
}
}
func SayHello(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
// 1. 请求类型是application/x-www-form-urlencoded时解析form数据
r.ParseForm()
fmt.Println(r.PostForm)
fmt.Println(r.PostForm.Get("name"), r.PostForm.Get("age"))
answer := `{"status": "ok"}`
w.Write([]byte(answer))
}
- client.go
func main() {
apiUrl := "http://127.0.0.1:8000"
data := url.Values{} // 类型:type Values map[string][]string
data.Set("name", "张三")
data.Set("age", "18")
resp, err := http.PostForm(apiUrl, data)
if err != nil {
fmt.Println(err.Error())
return
}
defer resp.Body.Close()
buf, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(string(buf))
}
POST json提交数据
- server.go
func main() {
http.HandleFunc("/", SayHello)
if err := http.ListenAndServe(":8000", nil); err != nil {
fmt.Println(err.Error())
return
}
}
func SayHello(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
// 1. 请求类型是application/json时从r.Body读取数据
buf, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf))
answer := `{"status": "ok"}`
w.Write([]byte(answer))
}
- client.go
func main() {
apiUrl := "http://127.0.0.1:8000"
contentType := "application/json"
data := `{"name": "haha", "age": 123}`
resp, err := http.Post(apiUrl, contentType, strings.NewReader(data))
if err != nil {
fmt.Println(err.Error())
return
}
defer resp.Body.Close()
buf, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(string(buf))
}
默认的server示例
使用Go语言中的net/http包来编写一个简单的接收HTTP请求的Server端示例,net/http包是对net包的进一步封装,专门用来处理HTTP协议的数据。具体的代码如下:
func main() {
http.HandleFunc("/", SayHello)
if err := http.ListenAndServe(":8000", nil); err != nil {
fmt.Println(err.Error())
return
}
}
func SayHello(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
// 1. 请求类型是application/json时从r.Body读取数据
buf, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf))
fmt.Fprintln(w, `{"status": "ok"}`)
}
自定义server
要管理服务端的行为,可以创建一个自定义的Server:
// 定义字段保存路由与视图函数之间的映射关系
var routerMapFunc = make(map[string]func(http.ResponseWriter, *http.Request))
type CustomerHandler struct {}
func (*CustomerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if viewFunc, ok := routerMapFunc[r.URL.String()]; ok {
viewFunc(w, r)
} else {
w.WriteHeader(http.StatusNotFound)
w.Write([]byte("404 not found"))
}
}
func main() {
s := &http.Server{
Addr: ":8000",
Handler: &CustomerHandler{},
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 2 << 20, // 1048576个字节,也就是1M
}
// 注册路由
routerMapFunc["/index"] = IndexView
if err := s.ListenAndServe(); err != nil {
fmt.Println(err.Error())
return
}
}
func IndexView(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, `{"status": "OK", "msg": "哈哈哈"}`)
}
golang中的标准库http的更多相关文章
- golang中的标准库数据格式
数据格式介绍 是系统中数据交互不可缺少的内容 这里主要介绍JSON.XML.MSGPack JSON json是完全独立于语言的文本格式,是k-v的形式 name:zs 应用场景:前后端交互,系统间数 ...
- golang中的标准库context
在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...
- golang中的标准库log
Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...
- golang中的标准库context解读
简介 golang 中的创建一个新的 goroutine , 并不会返回像c语言类似的pid,所有我们不能从外部杀死某个goroutine,所有我就得让它自己结束,之前我们用 channel + se ...
- golang中的标准库template
html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/templa ...
- golang中的标准库IO操作
参考链接 输入输出的底层原理 终端其实是一个文件,相关实例如下: os.Stdin:标准输入的文件实例,类型为*File os.Stdout:标准输出的文件实例,类型为*File os.Stderr: ...
- golang中的标准库time
时间类型 time.Time类型表示时间.我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息.示例代码如下: func main() { current := ...
- golang中的标准库反射
反射 反射是指程序在运行期对程序本身访问和修改的能力 变量的内在机制 变量包含类型信息和值信息 var arr [10]int arr[0] = 10 类型信息:是静态的元信息,是预先定义好的 值信息 ...
- golang中的标准库strconv
strconv 包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi().Itia().parse系列.format系列.append系列. string与int ...
随机推荐
- Mybatis-Plus中使用max、sum聚合函数、只查询指定字段、查询语句多个OR处理
聚合函数查询 可以使用以下方法 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select(" I ...
- Swagger请求报错:TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.
TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body. 如下图 ...
- 【LeetCode】1402. 做菜顺序 Reducing Dishes
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcode ...
- 【LeetCode】4. Median of Two Sorted Arrays 寻找两个正序数组的中位数
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:数组,中位数,题解,leetcode, 力扣,python ...
- 【LeetCode】983. 最低票价 Minimum Cost For Tickets(C++ & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetco ...
- 【LeetCode】367. Valid Perfect Square 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:完全平方式性质 方法二:暴力求解 方法三:二 ...
- 【LeetCode】199. Binary Tree Right Side View 解题报告(Python)
[LeetCode]199. Binary Tree Right Side View 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/probl ...
- Brute-force Algorithm(hdu3221)
Brute-force Algorithm Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Elasticsearch(二)--集群原理及优化
一.ES原理 1.索引结构ES是面向文档的 各种文本内容以文档的形式存储到ES中,文档可以是一封邮件.一条日志,或者一个网页的内容.一般使用 JSON 作为文档的序列化格式,文档可以有很多字段,在创建 ...
- 微信支付 V3 RSA 加签踩坑
最近在做微信支付,根据微信官方文档上的要求 用RSA加签去请求支付窗口的调起,下面详细列举支付开发过程: 当前项目的流程大概是,前端根据后端要求提交数据------->拿到后台返回的prepay ...