golang:net/http理解总结
2024-10-19 07:35:33
Go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现。使用net/http包,我们可以很方便地编写HTTP客户端或服务端的程序。
http服务端的创建流程
在使用http/net包创建服务端只需要两个步骤 绑定处理器函数 func(ResponseWriter, *Request)
与 启用监听 http.ListenAndServe
。
package main
import "net/http"
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("123"))
})
http.ListenAndServe(":8080", nil)
}
通过分析net/http
包中server.go
在执行创建http服务端主要执行了下面几个步骤:
http.HandleFunc
绑定处理函数- 所有的操作的方法都属于一个结构体
ServeMux
- m: 用户传入的路由和处理方法的映射表,路由和处理函数被定义为结构体
muxEntry
的属性 - mu: 实例化出来的对象的读写锁
- m: 用户传入的路由和处理方法的映射表,路由和处理函数被定义为结构体
- 调用
DefaultServeMux.Handle()
- 在
DefaultServeMux.Handle()
中调用DefaultServeMux.HandleFunc(pattern, handler)
- 在将传入http.HandleFunc()的回调函数,与路由的映射信息,放到该
DefaultServeMux
的属性中 映射map中muxEntry
http.ListenAndServe
启动服务监听- 实例化一个server结构体
- 调用
ListenAndServe()
ListenAndServe()
中net.Listen("tcp", addr)
启动tcp服务监听- Serve()中 appcet()处理用户连接,
go c.serve(connCtx)
处理业务段(如判断信息,拼接http、找到对应处理函数)
综上所述,net/http server.go
一切的基础为ServeMux 和 Handler
Go语言的net/http
包还封装了常用处理器,如 FileServer
,NotFoundHandler
RedirectHandler
http客户端的使用
package main
import (
"bytes"
"fmt"
"net/http"
"reflect"
)
func main() {
resp, err := http.Get("http://www.baidu.com")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(reflect.TypeOf(resp.Body)) // *http.gzipReader
b := bytes.NewBuffer(make([]byte, 1024))
b.ReadFrom(resp.Body)
fmt.Println(string(b.Bytes()))
}
post请求
package main
import (
"net/http"
"fmt"
"io/ioutil"
"net/url"
)
func main() {
postParam := url.Values{
"user": {"xxxxxx"},
"Pwd": {"1"},
}
resp, err := http.PostForm("http://www.baidu.com/loginRegister/login", postParam)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
最新文章
- JS代码放置位置、变量与数据类型、运算符与逻辑表达运算符
- C# 加密解密(DES,3DES,MD5,Base64) 类
- Java集合之Stack 源码分析
- 数据库基础-JOIN
- pick定理详解
- 【一天一道LeetCode】#4 Median of Two Sorted Arrays
- 用命令行撤销工作区的所有更改(修改文件&;&;新增文件)
- 使用logdashboard进行可视化的日志追踪
- Web前端 前端相关书籍推荐
- jsp Servlet 文件上传
- 【教程】在UEFI启动方式下,通过GRUB2引导,直接从硬盘ISO文件安装Windows10和Ubuntu双系统
- javascript运行机制之执行顺序详解
- 用Nginx搭建IIS集群实现负载均衡
- java使用java.lang.management监视和管理 Java 虚拟机
- Kotlin入门(20)几种常见的对话框
- oracle中case...when的用法
- HashMap相关总结
- 在家赚钱,威客网站的使用方法 CSDN项目频道、SXSOFT、任务中国、猪八戒四个网站的线上交易 三种交易模式(1)悬赏模式(2)招标模式(3)直接交易模式
- pi4j,Netbeans中togglebutton跟Jbutton的区别
- hadoop的两类配置文件及3种启动/关闭方式
热门文章
- Android Studio 之 Button(圆角,描边,按压效果)
- DFS 深搜专题 入门典例 -- 凌宸1642
- [.net] 关于Exception的几点思考和在项目中的使用(一)
- etcd简介及集群安装部署使用
- .netcore 写快递100的快递物流信息查询接口
- Flutter 状态管理- 使用 MobX
- python3 mysql API
- 基于 Socket 的群聊聊天室(带图形界面,包含注册、登录、数据入库功能)
- 痞子衡嵌入式:实抓Flash信号波形来看i.MXRT的FlexSPI外设下AHB读访问情形(无缓存)
- C - Harmonic Number(调和级数+欧拉常数)