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: 实例化出来的对象的读写锁
  • 调用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包还封装了常用处理器,如 FileServerNotFoundHandler 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))
}

最新文章

  1. JS代码放置位置、变量与数据类型、运算符与逻辑表达运算符
  2. C# 加密解密(DES,3DES,MD5,Base64) 类
  3. Java集合之Stack 源码分析
  4. 数据库基础-JOIN
  5. pick定理详解
  6. 【一天一道LeetCode】#4 Median of Two Sorted Arrays
  7. 用命令行撤销工作区的所有更改(修改文件&&新增文件)
  8. 使用logdashboard进行可视化的日志追踪
  9. Web前端 前端相关书籍推荐
  10. jsp Servlet 文件上传
  11. 【教程】在UEFI启动方式下,通过GRUB2引导,直接从硬盘ISO文件安装Windows10和Ubuntu双系统
  12. javascript运行机制之执行顺序详解
  13. 用Nginx搭建IIS集群实现负载均衡
  14. java使用java.lang.management监视和管理 Java 虚拟机
  15. Kotlin入门(20)几种常见的对话框
  16. oracle中case...when的用法
  17. HashMap相关总结
  18. 在家赚钱,威客网站的使用方法 CSDN项目频道、SXSOFT、任务中国、猪八戒四个网站的线上交易 三种交易模式(1)悬赏模式(2)招标模式(3)直接交易模式
  19. pi4j,Netbeans中togglebutton跟Jbutton的区别
  20. hadoop的两类配置文件及3种启动/关闭方式

热门文章

  1. Android Studio 之 Button(圆角,描边,按压效果)
  2. DFS 深搜专题 入门典例 -- 凌宸1642
  3. [.net] 关于Exception的几点思考和在项目中的使用(一)
  4. etcd简介及集群安装部署使用
  5. .netcore 写快递100的快递物流信息查询接口
  6. Flutter 状态管理- 使用 MobX
  7. python3 mysql API
  8. 基于 Socket 的群聊聊天室(带图形界面,包含注册、登录、数据入库功能)
  9. 痞子衡嵌入式:实抓Flash信号波形来看i.MXRT的FlexSPI外设下AHB读访问情形(无缓存)
  10. C - Harmonic Number(调和级数+欧拉常数)