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 客户端和服务器的方法。这个包中的方法DumpRequestOutDumpResponse 能够让您查看请求和响应。

可对前一个示例进行改进,以使用 net/http/httputil 包中的 DumpRequestOutDumpResponse
方法来支持日志功能。这些方法显示请求和响应的报头,还有返回的响应体。

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 请求)相关推荐

  1. python基础教程_学习笔记14:标准库:一些最爱——re

    标准库:一些最爱 re re模块包括对正則表達式的支持,由于以前系统学习过正則表達式,所以基础内容略过,直接看python对于正則表達式的支持. 正則表達式的学习,见<Mastering Reg ...

  2. python基础课程_学习笔记13:标准库:有些收藏夹——sys

    标准库:有些收藏夹 sys sys这个模块可以让你访问和python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描写叙述 argv 命令行參数,包含脚本名称 exit( ...

  3. Python学习笔记: Python 标准库概览二

    本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python 简介 Python流程介绍:深入Python 流程 Python数据结构 ...

  4. Python学习笔记: Python 标准库概览

    本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python 简介 Python流程介绍:深入Python 流程 Python数据结构 ...

  5. Python学习笔记17:标准库之数学相关(math包,random包)

    前面几节看得真心累.如今先来点简单easy理解的内容. 一 math包 math包主要处理数学相关的运算. 常数 math.e   # 自然常数e math.pi  # 圆周率pi 运算函数 math ...

  6. Python学习笔记14:标准库之信号量(signal包)

    signal包负责在Python程序内部处理信号.典型的操作包含预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等. 要注意,signal包主要是针对UNIX平台(比方Linux, MAC ...

  7. Javaweb学习笔记(JSP标准标签库)

    Javaweb学习笔记(JSP标准标签库) JSTL入门 安装和测试JSTL JSTL中的Core标签库 < c:out>标签 标签 标签 < c:catch>标签 标签 标签 ...

  8. STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料

    STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料 微雪课堂:http://www.waveshare.net/study/article-629-1.html 之前的正点原 ...

  9. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...

最新文章

  1. 动漫风格迁移AnimeGANv2,发布线上运行Demo
  2. linux 7za下载,Linux安装7za
  3. linux改变文件所属用户和组
  4. ajax几种回调函数
  5. 分布式系统中的CAP理论
  6. IDEA 启动项目报错 Shorten the command line via JAR manifest or via a classpath file and rerun
  7. 获取两个向量中间位置的点
  8. python解常微分方程龙格库_excel实现四阶龙格库塔法runge-kutta解二阶常微分方程范例.xls...
  9. 常用标点符号的英文名称
  10. KL Divergence KL散度
  11. 解决拉取代码no supported authentication methods avaiable
  12. python中函数与函数之间的调用,总是晕菜,整理如下,有不对或者补充的请提出来~...
  13. CVPR2020 论文
  14. 2016一周年点滴收获总结——遇见Elixir
  15. asp.net 探针下载_光探针代理卷:5.4功能展示
  16. 【ps】将歪的图片变正
  17. 60吨反渗透+混床程序 西门子200 smart 编写程序,西门子smart line触摸屏上位机组态
  18. 美国建筑智能服务解决方案提供商indus.ai获370万美元种子融资
  19. 批量去水印技术原理(以我的衣橱为例,给老赵找找麻烦)
  20. tcp四次挥手 最后一次ack如果没有收到

热门文章

  1. 2022-2028年中国钢铁智能制造产业竞争现状及发展趋势分析报告
  2. java写游戏的聊天怎么写_怎么用JAVA编写一个打字游戏
  3. 2022-2028年中国新零售行业深度调研及投资前景预测报告(全卷)
  4. HA: Forensics靶机渗透测试
  5. 工艺技术:14nm与28nm工艺
  6. CodeGen字段循环Field Loop
  7. TensorRT 基于Yolov3的开发
  8. NVIDIA安培架构
  9. Docker核心技术之仓库
  10. Handler 实现的一个延时操作