如何在Go中发起HTTP请求

引言

当一个程序需要与另一个程序通信时,许多开发人员会使用HTTP。Go的优势之一是其标准库的广度,HTTP也不例外。Go net/http包不仅支持[创建HTTP服务器],而且它还可以作为客户端进行HTTP请求。

在本教程中,您将创建一个程序,向HTTP服务器发出几种类型的HTTP请求。首先,你将使用默认的Go HTTP客户端发起一个GET请求。然后,你将改进你的程序,使用body发起一个POST请求。最后,您将自定义您的POST请求,以包含一个HTTP头并添加一个超时,如果您的请求花费了太长时间,则会触发超时。

发起GET请求

Go net/http包有几种不同的方式来使用它作为客户端。你可以使用一个通用的、全局的HTTP客户端,例如http.Get,来快速发出一个只有URL和主体的HTTP GET请求,或者你可以创建一个http.Request来开始自定义单个请求的某些方面。在本节中,您将使用http.Get创建一个初始程序来发出HTTP请求,然后您将更新它以使用默认HTTP客户端http.Request

使用http.Get发起请求

在程序的第一次迭代中,你将使用http.Get函数向程序中运行的HTTP服务器发出请求。http.Get函数很有用,因为你不需要在程序中进行任何额外的设置就可以发出请求。如果你需要发出单个快速请求,http.Get可能是最好的选择。

要开始创建程序,需要一个目录来保存程序所在的目录。在本教程中,你将使用一个名为projects的目录。

首先,创建projects目录并导航到它:

mkdir projects
cd projects

接下来,创建项目目录并导航到它。在这种情况下,使用httpclient目录:

mkdir httpclient
cd httpclient

httpclient目录下,使用nano或者你最喜欢的编辑器来打开main.go文件:

nano main.go

main.go文件中,首先添加以下几行:

main.go

package mainimport ("errors""fmt""net/http""os""time"
)const serverPort = 3333

你添加package名称main,这样你的程序就会被编译为一个你可以运行的程序,然后包含一个import语句,包含你将在这个程序中使用的各种包。之后,创建一个名为serverPort的值为3333const,它将被用作HTTP服务器监听的端口和HTTP客户端将要连接的端口。

接下来,在main.go文件中创建一个main函数,并设置一个goroutine来启动HTTP服务器:

main.go

...
func main() {go func() {mux := http.NewServeMux()mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Printf("server: %s /\n", r.Method)})server := http.Server{Addr:    fmt.Sprintf(":%d", serverPort),Handler: mux,}if err := server.ListenAndServe(); err != nil {if !errors.Is(err, http.ErrServerClosed) {fmt.Printf("error running http server: %s\n", err)}}}()time.Sleep(100 * time.Millisecond)

你的HTTP服务器设置为只要请求根路径/就使用fmt.Printf来打印传入请求的信息。它还被设置为监听serverPort。最后,一旦你启动了服务端goroutine,你的程序会在短时间内使用time.Sleep。睡眠时间允许HTTP服务器有足够的时间启动并开始为你的下一个请求提供响应。

现在,同样在main函数中,使用fmt.Sprintf来设置请求URL,将http://localhost主机名与服务器正在监听的serverPort值结合起来。然后,使用http.Get向该URL发出请求,如下所示:

main.go

...requestURL := fmt.Sprintf("http://localhost:%d", serverPort)res, err := http.Get(requestURL)if err != nil {fmt.Printf("error making http request: %s\n", err)os.Exit(1)}fmt.Printf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在QT Creator下用CMake编译GEOS库

最近,想要在C下编一个可用GDAL模块的地图管理系统,找来找去,找到了GEOS。GEOS(Geometry Engine-Open Source)开源几何引擎 是一个用于计算几何的JTS库的 C/C实现,专注于地理信息系统 (GIS&#…

obsidian + cloudreve 搭建个人云盘

obsidian 是什么?obsidian 是一款好用的笔记软件,拥有强大的第三方库,最重要的是支持WebDAV,可以自动同步笔记到云端服务器 cloudreve 是什么?cloudreve 是一款私人网盘系统,部署简单、界面简洁&#xff0…

11、Qt:创建/删除文件夹、拷贝文件

一、创建文件夹 声明: bool createPath(QString strPath); 定义: /** * brief MainWindow::CreatePath 创建文件夹 * param strPath 要创建的文件夹路径 * return 创建成功返回true,失败返回false */ bool MainWindow::createPath(QString s…

一篇文章概括!状态码分别是什么意思?

hello,我是小索奇,HTTP状态码被分为几个类别,每个类别代表着不同类型的响应。这里是100到500之间的状态码的大致含义: 1xx (信息性状态码) 100 Continue: 客户端应继续其请求。101 Switching Protocols: 请求者已要求服务器切换协议&#x…

速通Python基础语法--语句篇

缩进和代码块 一 条件语句if/elif if的基本语法 示例 条件语句嵌套 练习1 练习2 二 空语句 三 while循环 示例 打印1-10 求1-100的和 求5! 求1-5的阶乘之和 四 for循环 for的基本语法 1~range[ ,) 五 continue/break continue:结束当前循环,继续下一次循环 break:结束整个循…

《每天一分钟学习C语言·四》文本读写操作及二进制读写

fopen(参数1,参数2),第一个参数是要打开的文件名,文件名字符串,第二个参数用于制定文件打开模式的一个字符串。 注:如果要打开某个盘的文本如F盘test文件夹下的test.txt文本,则fopen(“F:\test\test.txt”,”r”); 程序…

AcWing算法进阶课-1.1.2Dinic/ISAP求最大流

算法进阶课整理 CSDN个人主页:更好的阅读体验 原题链接 题目描述 给定一个包含 n n n 个点 m m m 条边的有向图,并给定每条边的容量,边的容量非负。 图中可能存在重边和自环。求从点 S S S 到点 T T T 的最大流。 输入格式 第一行包…

本地websocket服务端结合cpolar内网穿透实现公网访问

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

黑马头条--day07--app文章搜索

目录 一.安装elasticsearch 1.拉取镜像 2.创建存放数据及配置文件的文件夹,启动时挂载。 4.修改文件夹权限 5.启动容器 5.1参数解释 6.安装ik分词器 6.2测试一下Ik分词器 二.添加文章索引库 1查询所有的文章信息,批量导入到es索引库中 2)测试 …

深度盘点:除了BRC20外 这些公链潜力铭文也值得关注

近日的铭文市场风起云涌,除BRC20占据着市场70%以上的份额外,其他公链的铭文也在快速发展

Spring Boot + EasyUI 全屏布局(二)

一、创建一个Spring Boot EasyUI项目 Spring Boot EasyUI 创建第一个项目(一)_springboot整合easyui-CSDN博客 二、相关知识点总结 布局(layout)是有五个区域(北区 north、南区 south、东区 east、西区 west 和中区…

C++ 如何使用对二维vector进行读和写

要使用二维vector进行读和写&#xff0c;可以通过两层循环来遍历每个元素。下面是一个简单的示例代码&#xff1a; #include <iostream> #include <vector>int main() {// 创建一个二维vectorstd::vector<std::vector<int>> matrix {{1, 2, 3},{4, 5…

Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十三章、拦截器 拦截器 &#xff1a;Interceptor 拦截 中断 类似于javaweb中的Filter&#xff0c;不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦…

typeScript安装及TypeScript tsc 不是内部或外部命令,也不是可运行的程序或批处理文件解决办法

一、typeScript安装&#xff1a; # 全局安装 TypeScript npm i -g typescript 二、检查是否安装成功ts&#xff1a; #检查ts的版本号 确定是否安装成功 tsc -v出现报错&#xff1a;‘tsc’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 解决&#xff1…

fastGitHub工具推荐(如果打不开github或者使用很慢可以使用该工具)

目录 一&#xff0c;针对问题二&#xff0c;下载1&#xff0c;github里面下载FastGitHub2&#xff0c;博客上传了下载资源 三&#xff0c;安装使用点击执行文件即可 一&#xff0c;针对问题 当使用github很慢&#xff0c;或者根本打不开的时候&#xff0c;就可以使用该工具 …

Java基础知识复习

目录 一、Java语言基础知识&#xff0c;包括面向对象编程、语法特性等 0、什么是面向对象编程&#xff1f; 1、基本语法&#xff1a; 2、变量和数据类型&#xff1a; 3、运算符和表达式&#xff1a; 4、控制结构&#xff1a; 5、函数和方法&#xff1a; 6、类和对象&#xff1a…

python3+selenium 切换窗口方法

第一种&#xff1a; 使用场景&#xff1a; 打开多个窗口&#xff0c;需要定位到新打开的窗口 使用方法&#xff1a; # 获取打开的多个窗口句柄 windows driver.window_handles # 切换到当前最新打开的窗口 driver.switch_to.window(windows[-1]) 举例说明&#xff1a;# _._ …

电商数仓项目----笔记五(数仓架构和建模)

ODS&#xff1a;数据源 DWD&#xff1a;加工数据 DWS&#xff1a;统计数据 ADS&#xff1a;分析数据 DIM&#xff1a; 维度层&#xff08;大家都有可能用得上的部分&#xff09; ER模型 数据仓库之父Bill Inmon提出的建模方法是从全企业的…

如何使用jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入&#xff0c;然后写一些测试脚本&#xff0c;这就是你所说的自动化测试&#xff0c;其实这个还不能算是真正的自动化测试&#xff0c;你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗&#xff…

Ubuntu 常用命令之 unzip 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 unzip命令在Ubuntu系统中用于解压缩.zip文件。它可以解压缩一个或多个.zip文件&#xff0c;并将文件解压缩到当前目录或指定的目录。 unzip命令的一般格式 unzip [选项] zipfile [file...]其中&#xff0c;zipfile是要解压的.zi…