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 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!

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 端口。

go 复制代码
package main

import (
	"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/go
	http.HandleFunc("/go", apiHandler)
	// 监听地址和端口
	http.ListenAndServe("127.0.0.1:8080", nil)
}

运行结果:

会发现,get 和 post 两种请求方式都支持。

二、HTTP客户端

下面的示例中,用 net/http 包中的 http 通过 Get() 方法发起请求,返回结果赋值给 resp,并用 defer 来延迟关闭连接。

定义一个 byte 类型数字,固定长度 1024,从返回体中循环读取数据给 buf,用 string 函数包装成字符串输出。

go 复制代码
package main

import (
	"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
		}

	}
}

运行结果:

bash 复制代码
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,表示请求失败,我们就输出相应的提示信息。最后,我们获取了响应的内容并输出。

go 复制代码
package main

import (
	"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))
}

运行结果:

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

四、总结

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

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

评论去告诉我哦!!!一起学习一起进步!!!

相关推荐
花酒锄作田10 天前
Gin 框架中的规范响应格式设计与实现
golang·gin
qwfys20010 天前
How to install golang 1.26.0 to Ubuntu 24.04
ubuntu·golang·install
codeejun10 天前
每日一Go-25、Go语言进阶:深入并发模式1
开发语言·后端·golang
石牌桥网管10 天前
Go 泛型(Generics)
服务器·开发语言·golang
小二·10 天前
Go 语言系统编程与云原生开发实战(第21篇)
开发语言·云原生·golang
小二·10 天前
Go 语言系统编程与云原生开发实战(第20篇)
开发语言·云原生·golang
女王大人万岁10 天前
Golang实战Eclipse Paho MQTT库:MQTT通信全解析
服务器·开发语言·后端·golang
codeejun10 天前
每日一Go-24、Go语言实战-综合项目:规划与搭建
开发语言·后端·golang
石牌桥网管10 天前
Go类型断言
开发语言·后端·golang
普通网友11 天前
PHP语言的正则表达式
开发语言·后端·golang