go语言作为一个面向网络 面向服务 高并发的一门通用语言 http库是非常重要的
下面我们来了解http库及其他标准库
http库可以对客户端做很多的工作 下面我们来看一下
func main() {
resp, err := http.Get("https://mp.csdn.net")//网址是否能够打开 如果能打开返回结构体指针
if err != nil{ //错误返回报告
panic(err)
}
defer resp.Body.Close() //预先处理resp关闭
s, err := httputil.DumpResponse(resp,true)//分析结构体指针是否正确 如果正确 返回utf8格式
if err != nil{
panic(err)
}
fmt.Printf("%s", s)//打印utf8
}
这是一个最简单的http调用函数
下面我们对http.Get进行控制
首先打开爱慕课官网 按f12进入开发者模式
我们发现点击移动端显示后 网页会自动跳转出去
那他是怎么做的呢 我们也来试试看
首先获得一条指令
User-Agent:
Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1
这是指令 我复制下来了 下面我们进入代码
func main() {
request,err := http.NewRequest(http.MethodGet,"http://www.imooc.com",nil)//同样返回结构体指针
//将跳转指令放入requst中
request.Header.Add("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1")
resp, err := http.DefaultClient.Do(request)//引用Client{}结构体 将Client结构体指针返回到变量中
if err != nil{ //错误返回报告
panic(err)
}
defer resp.Body.Close() //预先处理resp关闭
s, err := httputil.DumpResponse(resp,true)//分析结构体指针是否正确 如果正确 返回utf8格式
if err != nil{
panic(err)
}
fmt.Printf("%s", s)//打印utf8
}
运行成功 打印移动端页面信息
其实我们可以不用http.DefaultClient.Do 因为他就是引用的Client 我们可以直接使用Client 自由控制Client
比如打印出网址信息
func main() {
request,err := http.NewRequest(http.MethodGet,"http://www.imooc.com",nil)//同样返回结构体指针
//将跳转指令放入requst中
request.Header.Add("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1")
client := http.Client{ //结构体Client赋值给变量 client
CheckRedirect: func(req *http.Request,//指定地址
via []*http.Request,//指定路径
) error{
fmt.Println("Redirect:",req) //将Request中的指定网址打印出
return nil //一般情况下为nil
},
}
resp , err := client.Do(request) //调用Do 返回结构体指针
if err != nil{ //错误返回报告
panic(err)
}
defer resp.Body.Close() //预先处理resp关闭
s, err := httputil.DumpResponse(resp,true)//分析结构体指针是否正确 如果正确 返回utf8格式
if err != nil{
panic(err)
}
fmt.Printf("%s", s)//打印utf8
}
当我们使用自己定义的Client时 结果最上方打印出两条网址 一条是主网址 一条是跳转网址
我们看一下使用http库做了什么
.使用http客户端发送请求
.使用http.Client http.NewRequest控制请求头部 重定向等
.使用httputil简化工作
下面我们在看一下http服务器的性能分析
打开我们之前的web.go
package main
import (
"net/http"
"awesomeProject1/filelistingserver/filelisting"
"os"
"github.com/gpmgo/gopm/modules/log"
"awesomeProject1/golog"
_ "net/http/pprof"
)
type appHandler func (writer http.ResponseWriter,request *http.Request) error
func errWrapper(handler appHandler) func(http.ResponseWriter, *http.Request){
return func (writer http.ResponseWriter,request *http.Request){
defer func() {
if r := recover(); r != nil {
golog.Printf("Panic: %v", r)
http.Error(writer, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
}
}()
err := handler(writer,request)
if err != nil{
log.Warn("Error handling request: %s", err.Error())
if userErr, ok := err.(userError); ok{
http.Error(writer,userErr.Message(),http.StatusBadRequest)
return
}
code := http.StatusOK
switch {
case os.IsNotExist(err):
code = http.StatusNotFound
case os.IsPermission(err):
code = http.StatusForbidden
default:
code = http.StatusInternalServerError
}
http.Error(writer,http.StatusText(code),code)
}
}
}
type userError interface{
error
Message() string
}
func main(){
http.HandleFunc("/",errWrapper(filelisting.HandlefileList))
err := http.ListenAndServe(":8888",nil)
if err != nil{
panic(err)
}
}
我们在pprof后面加上_ "net/http/pprof"就可以不调用函数而使用包
接下来打开端口8888
我们可以查看服务的运行状况 内存 cpu 等 根据运行状况进行优化
除了这个还有一个功能是图形化 记录30秒的cpu变化
这样就显示了cpu的资源使用情况
当然我们还可以查看内存的使用情况
http的性能分析
.import (_ “net/http/pprof”)
.访问/debug/pprof/
.使用go tool pprof分析性能
最后我们简要说一下其他库
.bufio 可以缓存较多数据后 一起发送到硬盘上
.log 打印错误报告
.encoding/json 后面会详细说
.ergexp 后面会详细
.time 跟时间有关的库
.string/math/rand 基本标准库 字符有关/数学有关/随机有关
那我们如何查看各种函数的用法呢 如下
在powershell输入godoc -http :8888打开浏览器查看packages文档
或者去官网查看标准库中文版
go语言的标准库就到这