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这个标准库来处理。

  1. 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))
}
  1. 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表单请求数据

  1. 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))
}
  1. 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提交数据

  1. 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))
}
  1. 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的更多相关文章

  1. golang中的标准库数据格式

    数据格式介绍 是系统中数据交互不可缺少的内容 这里主要介绍JSON.XML.MSGPack JSON json是完全独立于语言的文本格式,是k-v的形式 name:zs 应用场景:前后端交互,系统间数 ...

  2. golang中的标准库context

    在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...

  3. golang中的标准库log

    Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...

  4. golang中的标准库context解读

    简介 golang 中的创建一个新的 goroutine , 并不会返回像c语言类似的pid,所有我们不能从外部杀死某个goroutine,所有我就得让它自己结束,之前我们用 channel + se ...

  5. golang中的标准库template

    html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/templa ...

  6. golang中的标准库IO操作

    参考链接 输入输出的底层原理 终端其实是一个文件,相关实例如下: os.Stdin:标准输入的文件实例,类型为*File os.Stdout:标准输出的文件实例,类型为*File os.Stderr: ...

  7. golang中的标准库time

    时间类型 time.Time类型表示时间.我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息.示例代码如下: func main() { current := ...

  8. golang中的标准库反射

    反射 反射是指程序在运行期对程序本身访问和修改的能力 变量的内在机制 变量包含类型信息和值信息 var arr [10]int arr[0] = 10 类型信息:是静态的元信息,是预先定义好的 值信息 ...

  9. golang中的标准库strconv

    strconv 包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi().Itia().parse系列.format系列.append系列. string与int ...

随机推荐

  1. Vue父子组件通信(父级向子级传递数据、子级向父级传递数据、Vue父子组件存储到data数据的访问)

    Vue父子组件通信(父级向子级传递数据.子级向父级传递数据.Vue父子组件存储到data数据的访问) 一.父级向子级传递数据[Prop]: ● Prop:子组件在自身标签上,使用自定义的属性来接收外界 ...

  2. chrome/microsoft/brave等浏览器离线下载crx并安装(解决download interrupted)

    重要网站 离线下载crx 问题描述 使用chrome/microsoft edge/ brave 下载chrome webstroe插件时,提示: download interrupted. 解决方案 ...

  3. 【机器学*】k-*邻算法(kNN) 学*笔记

    [机器学*]k-*邻算法(kNN) 学*笔记 标签(空格分隔): 机器学* kNN简介 kNN算法是做分类问题的.思想如下: KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数 ...

  4. Codeforces 777B:Game of Credit Cards(贪心)

    After the fourth season Sherlock and Moriary have realized the whole foolishness of the battle betwe ...

  5. matplotlib 进阶之Constrained Layout Guide

    目录 简单的例子 Colorbars Suptitle Legends Padding and Spacing spacing with colobars rcParams Use with Grid ...

  6. BP网络简单实现

    目录 BP算法的简单实现 Linear 全连接层 ReLu MSELoss 交叉熵损失函数 BP算法的简单实现 """ BPnet 简易实现 约定输入数据维度为(N, i ...

  7. 基于Spring MVC + Spring + MyBatis的【医院就诊挂号系统】

    资源下载:https://download.csdn.net/download/weixin_44893902/21727306 一.语言和环境 1.实现语言: JAVA语言. 2.环境要求: MyE ...

  8. MySQL数据操作与查询笔记 • 【第4章 SELECT 数据查询】

    全部章节   >>>> 本章目录 4.1 select 选择列表 4.1.1 select 基本结构 4.1.2 选择列表 4.2 MySQL 运算符 4.2.1 MySQL ...

  9. PHP 开启 Opcache 功能提升程序处理效率

    简介 Opcache 的前生是 Optimizer+ ,它是 Zend 开发的 PHP 优化加速组件.Optimizer+ 将 PHP 代码预编译生成的脚本文件 Opcode 缓存在共享内存中供以后反 ...

  10. 初识python: xml 操作

    导入模块: import xml.etree.ElementTree as ET 创建xml文件: new_xml = ET.Element("namelist") # 创建根节点 ...