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

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

相关推荐
小吴同学(wlx)2 小时前
Golang 进阶3—— 协程&管道
golang
技术卷2 小时前
GO网络编程(三):海量用户通信系统1:登录功能初步
golang·网络编程
虽千万人 吾往矣5 小时前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
__AtYou__21 小时前
Golang | Leetcode Golang题解之第448题找到所有数组中消失的数字
leetcode·golang·题解
千年死缓1 天前
go+redis基于tcp实现聊天室
redis·tcp/ip·golang
吃着火锅x唱着歌1 天前
Redis设计与实现 学习笔记 第五章 跳跃表
golang
技术卷1 天前
Redis数据库与GO完结篇:redis操作总结与GO使用redis
数据库·redis·golang
white.tie1 天前
vscode配置golang
ide·vscode·golang
陈序缘1 天前
Go语言实现长连接并发框架 - 任务管理器
linux·服务器·开发语言·后端·golang
0x派大星2 天前
【Golang】语法基础——切片:灵活、高效的数据处理利器
golang