Go 学习笔记(76)— Go 标准库 net/http 创建客户端(发送 GET、POST 请求)
1. Get 请求
1.1 使用 net/http 包的快捷方法 GET
package mainimport ("fmt""io/ioutil""net/http"
)func main() {resp, err := http.Get("http://www.baidu.com")if err != nil {fmt.Println(err)}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println(err)}fmt.Println(string(body))
}
1.2 自定义客户端
package mainimport ("fmt""io/ioutil""net/http"
)func main() {client := &http.Client{}request, err := http.NewRequest("GET", "http://www.baidu.com", nil)if err != nil {fmt.Println(err)}resp, err := client.Do(request)if err != nil {fmt.Println(err)}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println(err)}fmt.Println(string(body))
}
使用自定义 HTTP
客户端意味着可对请求设置报头、基本身份验证和 cookies 。鉴于使用快捷方法和自定义HTTP 客户端时, 发出请求所需代码的差别很小, 建议除非要完成的任务非常简单,否则都使用自定义HTTP 客户端。
2. POST 请求
package mainimport ("fmt""io/ioutil""net/http""strings"
)func main() {data := strings.NewReader(`{"some": "json"}`)resp, err := http.Post("https://httpbin.org/post", "application/json", data)if err != nil {fmt.Println(err)}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println(err)}fmt.Println(string(body))
}
输出结果:
{"args": {}, "data": "{\"some\": \"json\"}", "files": {}, "form": {}, "headers": {"Accept-Encoding": "gzip", "Content-Length": "16", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Go-http-client/2.0", "X-Amzn-Trace-Id": "Root=1-60575025-22341e95217463712e18068e"}, "json": {"some": "json"}, "origin": "192.168.0.110", "url": "https://httpbin.org/post"
}
3. 调试 HTTP
net/http/httputil
也提供了能够让您轻松调试 HTTP
客户端和服务器的方法。这个包中的方法DumpRequestOut
和 DumpResponse
能够让您查看请求和响应。
可对前一个示例进行改进,以使用 net/http/httputil
包中的 DumpRequestOut
和 DumpResponse
方法来支持日志功能。这些方法显示请求和响应的报头,还有返回的响应体。
package mainimport ("fmt""io/ioutil""net/http""net/http/httputil""strings"
)func main() {client := &http.Client{}data := strings.NewReader(`{"some": "json"}`)request, err := http.NewRequest("POST", "https://httpbin.org/post", data)request.Header.Add("Accept", "application/json") // 增加请求报文头/*通过使用 Accept 报头, 客户端告诉服务器它想要的是 application/json,而服务器返回数据时将 Content-Type 报头设置成了application/json。*/if err != nil {fmt.Println(err)}debugReq, err := httputil.DumpRequestOut(request, true)if err != nil {fmt.Println(err)}fmt.Println("debugReq is ", string(debugReq))resp, err := client.Do(request)if err != nil {fmt.Println(err)}defer resp.Body.Close()debugResponse, err := httputil.DumpResponse(resp, true)if err != nil {fmt.Println(err)}fmt.Println("debugResponse is ", string(debugResponse))body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println(err)}fmt.Println(string(body))
}
输出结果:
debugReq is POST /post HTTP/1.1
Host: httpbin.org
User-Agent: Go-http-client/1.1
Content-Length: 16
Accept: application/json
Accept-Encoding: gzip{"some": "json"}
debugResponse is HTTP/2.0 200 OK
Content-Length: 441
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Content-Type: application/json
Date: Sun, 21 Mar 2021 14:35:01 GMT
Server: gunicorn/19.9.0
4. 处理超时
使用默认的 HTTP
客户端时,没有对请求设置超时时间。这意味着如果服务器没有响应,则请求将无限期地等待或挂起。对于任何请求,都建议设置超时时间。这样如果请求在指定的时间内没有完成, 将返回错误。
client := &http.Client{Timeout: 1 * time.Second,}
上述配置要求客户端在 1s 内完成请求。但是因为服务器的响应速度不够快。完全有可能发生请求超时的情况。如下:
Post https://httpbin.org/post: net/http:request canceled (Client.Timeout exceeded while awaiting headers)
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x40 pc=0x63491b]
Go 学习笔记(76)— Go 标准库 net/http 创建客户端(发送 GET、POST 请求)相关推荐
- python基础教程_学习笔记14:标准库:一些最爱——re
标准库:一些最爱 re re模块包括对正則表達式的支持,由于以前系统学习过正則表達式,所以基础内容略过,直接看python对于正則表達式的支持. 正則表達式的学习,见<Mastering Reg ...
- python基础课程_学习笔记13:标准库:有些收藏夹——sys
标准库:有些收藏夹 sys sys这个模块可以让你访问和python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描写叙述 argv 命令行參数,包含脚本名称 exit( ...
- Python学习笔记: Python 标准库概览二
本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python 简介 Python流程介绍:深入Python 流程 Python数据结构 ...
- Python学习笔记: Python 标准库概览
本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python 简介 Python流程介绍:深入Python 流程 Python数据结构 ...
- Python学习笔记17:标准库之数学相关(math包,random包)
前面几节看得真心累.如今先来点简单easy理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e # 自然常数e math.pi # 圆周率pi 运算函数 math ...
- Python学习笔记14:标准库之信号量(signal包)
signal包负责在Python程序内部处理信号.典型的操作包含预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等. 要注意,signal包主要是针对UNIX平台(比方Linux, MAC ...
- Javaweb学习笔记(JSP标准标签库)
Javaweb学习笔记(JSP标准标签库) JSTL入门 安装和测试JSTL JSTL中的Core标签库 < c:out>标签 标签 标签 < c:catch>标签 标签 标签 ...
- STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料
STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料 微雪课堂:http://www.waveshare.net/study/article-629-1.html 之前的正点原 ...
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...
最新文章
- 动漫风格迁移AnimeGANv2,发布线上运行Demo
- linux 7za下载,Linux安装7za
- linux改变文件所属用户和组
- ajax几种回调函数
- 分布式系统中的CAP理论
- IDEA 启动项目报错 Shorten the command line via JAR manifest or via a classpath file and rerun
- 获取两个向量中间位置的点
- python解常微分方程龙格库_excel实现四阶龙格库塔法runge-kutta解二阶常微分方程范例.xls...
- 常用标点符号的英文名称
- KL Divergence KL散度
- 解决拉取代码no supported authentication methods avaiable
- python中函数与函数之间的调用,总是晕菜,整理如下,有不对或者补充的请提出来~...
- CVPR2020 论文
- 2016一周年点滴收获总结——遇见Elixir
- asp.net 探针下载_光探针代理卷:5.4功能展示
- 【ps】将歪的图片变正
- 60吨反渗透+混床程序 西门子200 smart 编写程序,西门子smart line触摸屏上位机组态
- 美国建筑智能服务解决方案提供商indus.ai获370万美元种子融资
- 批量去水印技术原理(以我的衣橱为例,给老赵找找麻烦)
- tcp四次挥手 最后一次ack如果没有收到