GO学习之 网络通信(Net/Http)

GO系列

1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作
6、GO学习之 通道(Channel)
7、GO学习之 多线程(goroutine)
8、GO学习之 函数(Function)
9、GO学习之 接口(Interface)
10、

文章目录

  • GO系列
  • 前言
  • 一、HTTP服务端
  • 二、HTTP客户端
  • 三、第三方的 HTTP 包
  • 四、总结

前言

按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
JAVA中我们可以使用 HttpClient来发起一个 Http 连接通过Tcp/Ip协议来获取数据,不过在Spring等框架中做了各种封装,例如RestTemplateOpenFeign的组件,可以很方便的发起一个网络请求,也有SpringMVC等框架供我们提供一个对外的接口。
那在 Go 语言中的网络编程非常简单和强大,内置了标准库net/http,提供了丰富的函数和类型,用于发起Http请求和 Http服务器。

一、HTTP服务端

下面示例实现了一个简单的API接口访问,首先定义一个函数(apiHandler)来处理请求,就类似于SpringMVC中的 handler 请求处理器。
然后通过Go语言提供的标准库中的net/http包中的 http定义一个接口,配置接口名为 /go,配置接口监听地址为 127.0.0.1:8080 端口。

package mainimport ("fmt""net/http"
)// 请求处理器函数
func apiHandler(response http.ResponseWriter, request *http.Request) {fmt.Println(request.RemoteAddr, "连接成功!")// 请求方式fmt.Println("method:", request.Method)// 请求路径和参数fmt.Println("url:", request.URL.Path)fmt.Println("header:", request.Header)fmt.Println("body", request.Body)// 相应response.Write([]byte("Hello, 你好,欢迎访问!!!"))
}func main() {// 通过 http 定义一个接口 http://127.0.0.1:8080/gohttp.HandleFunc("/go", apiHandler)// 监听地址和端口http.ListenAndServe("127.0.0.1:8080", nil)
}

运行结果:
通过postman访问
会发现,get 和 post 两种请求方式都支持。

二、HTTP客户端

下面的示例中,用 net/http 包中的 http 通过 Get() 方法发起请求,返回结果赋值给 resp,并用 defer 来延迟关闭连接。
定义一个 byte 类型数字,固定长度 1024,从返回体中循环读取数据给 buf,用 string 函数包装成字符串输出。

package mainimport ("fmt""io""net/http"
)func main() {resp, _ := http.Get("http://127.0.0.1:8080/go")// 关闭连接, defer 延迟关闭defer resp.Body.Close()fmt.Println("请求状态:", resp.Status)fmt.Println("请求头:", resp.Header)buf := make([]byte, 1024)for {// 接受服务器信息n, err := resp.Body.Read(buf)if err != nil && err != io.EOF {fmt.Println("请求出错:", err)} else {fmt.Println("请求成功!")result := string(buf[:n])fmt.Println("请求结果:", result)break}}
}

运行结果:

PS D:\workspaceGo\src\http> go run .\httpClient.go
请求状态: 200 OK
请求头: map[Content-Length:[37] Content-Type:[text/plain; charset=utf-8] Date:[Sun, 06 Aug 2023 15:47:04 GMT]]
请求成功!
请求结果: Hello, 你好,欢迎访问!!!

三、第三方的 HTTP 包

Go 语言还有许多第三方的 HTTP 客户端和服务器库,可以帮助我们更方便地实现 HTTP 请求和服务。一些常用的 HTTP 客户端库有 github.com/go-resty/restygithub.com/parnurzeal/gorequest 等;HTTP 服务器库有 github.com/gin-gonic/gingithub.com/gorilla/mux 等。
这些库提供了更多的功能和便利性,可以根据项目需求选择适合的库来使用。

我们首先创建了一个 resty 客户端,然后使用 R() 函数创建一个请求。接着使用 Get 方法发起一个 GET 请求,并将响应保存在 response 变量中。我们检查了响应的状态码,如果状态码不是 200,表示请求失败,我们就输出相应的提示信息。最后,我们获取了响应的内容并输出。

package mainimport ("fmt""gopkg.in/resty.v1"
)func main() {// 创建一个客户端client := resty.New()// 发送 Get 请求response, err := client.R().Get("http://127.0.0.1:8080/go")if err != nil {fmt.Println("请求失败:", err)return}// 请求响应if response.StatusCode() != 200 {fmt.Println("请求失败,状态码:", response.StatusCode())return}// 获取响应内容body := response.Body()fmt.Println("响应结果:", string(body))
}

运行结果:

PS D:\workspaceGo\src\http> go run .\httpResty.go
响应结果: Hello, 你好,欢迎访问!!!

四、总结

go-resty/resty 包提供了丰富的功能,包括发送 GET、POST、PUT、DELETE 等请求,处理请求和响应的头部、查询参数、表单数据、JSON 数据等。它还支持连接池、超时设置、重试机制等功能,是一个非常强大和方便的 HTTP 请求库,特别适合在实际开发中使用。

现阶段还是对 Go 语言的学习阶段,想必有一些地方考虑的不全面,本文示例全部是亲自手敲代码并且执行通过。
如有问题,还请指教。
评论去告诉我哦!!!一起学习一起进步!!!

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

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

相关文章

新一代开源流数据湖平台Apache Paimon入门实操-下

文章目录 实战写表插入和覆盖数据更新数据删除数据Merge Into 查询表批量查询时间旅行批量增量查询 流式查询时间旅行ConsumerID 查询优化 系统表表指定系统表分区表全局系统表维表 CDC集成MySQLKafka支持schema变更 实战 写表 插入和覆盖数据 可以使用INSERT语句向表中插入…

QColorDialog

QColorDialog 颜色类 QColor颜色对话框API简单的使用 QColorDialog类是QDialog的子类, 通过这个类我们可以得到一个选择颜色的对话框窗口 颜色类 QColor 关于颜色的属性信息, 在QT框架中被封装到了一个叫QColor的类中。 各种颜色都是基于红, 绿, 蓝这三种颜色调配而成的, 并…

[分享]STM32G070 串口 乱码 解决方法

硬件 NUCLEO-G070RB 工具 cubemx 解决方法 7bit 改为 8bit printf 配置方法 添加头文件 #include <stdio.h> 添加重定向代码 #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endi…

linux - 用户权限

认知root用户 无论是Windows、Macos、Linux均采用多用户的管理模式进行权限管理 在Linux系统中,拥有最大权限的账户名为: root(超级管理员) root用户拥有最大的系统操作权限&#xff0c;而普通用户在许多地方的权限是受限的。普通用户的权限&#xff0c;一般在其HOME目录内是不…

【css】组合器

组合器是解释选择器之间关系的某种机制。在简单选择器器之间&#xff0c;可以包含一个组合器&#xff0c;从而实现简单选择器难以达到的效果。 CSS 中有四种组合器&#xff1a; 后代选择器 (空格)&#xff1a;匹配属于指定元素后代的所有元素&#xff0c;示例&#xff1a;div …

docker【安装、存储、镜像、仓库、网络、监控】

docker-0110.0.0.51docker-0210.0.0.52docker-0310.0.0.53 【1】docker安装 docker-01 [rootdocker-01 ~]# vim /etc/yum.conf [main] cachedir/var/cache/yum/$basearch/$releasever keepcache1 debuglevel2 logfile/var/log/yum.log exactarch1 obsoletes1 gpgcheck1 plugin…

JDBC(常用类与接口、实现数据库的增删查改)

目录 1.Connection接口常用方法 2.DriverMange类 3.Statement接口 4.实现表的数据更新&#xff08;增、改、删&#xff09; 5.实现数据查找&#xff08;ResultSet接口&#xff09; 6.PreparedStatement 数据更新 1.Connection接口常用方法 用来与数据库连接的对象&#xff…

Vue3+Vite+Pinia+Naive后台管理系统搭建之九:layout 动态路由布局

前言 如果对 vue3 的语法不熟悉的&#xff0c;可以移步Vue3.0 基础入门&#xff0c;快速入门。 github 开源库&#xff1a;Vue3-Vite-Pinia-Naive-Js gitee 开源库&#xff1a;Vue3-Vite-Pinia-Naive-Js 1. 管理系统页面结构 由 menu&#xff0c;面包屑&#xff0c;用户…

【Linux进程篇】进程概念(2)

【Linux进程篇】进程概念&#xff08;2&#xff09; 目录 【Linux进程篇】进程概念&#xff08;2&#xff09;进程状态Linux对进程的说法linux中的信号 进程状态查看Z(zombie)——僵尸进程僵尸进程的危害 孤儿进程 进程优先级基本概念查看系统进程PRI &#xff08;优先级priori…

wireshark 安装和使用

wireshark&#xff0c;世界上最受欢迎的网络协议分析器。是一个网络流量分析器&#xff0c;或“嗅探器”&#xff0c;适用于Linux、macOS、*BSD和其他Unix和类Unix操作系统以及Windows。它使用图形用户界面库Qt以及libpcap和npcap作为数据包捕获和过滤库。 wireshark&#xff…

解决Vs Code工具开发时 保存React文件时出现乱码情况

Vs Code工具开发时 保存React文件时出现乱码情况 插件库搜索:JS-CSS-HTML Formatter 把这个插件禁用或者卸载就解决保存时出现乱码的问题了; 如果没有解决,再看下面方案! 出现乱码问题通常是因为文件的编码格式不正确。您可以尝试以下解决方法&#xff1a; 确认文件编码格式&a…

【瑞吉外卖】Git部分学习

Git简介 Git是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为两种&#xff1a; 本地仓库&#xff1a;开发人员自己电脑上的Git仓库 远程仓库&#xff1a;远程服务器上的Git仓库…