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 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)
}

运行结果:
GO学习之 网络通信(Net/Http)_第1张图片
会发现,get 和 post 两种请求方式都支持。

二、HTTP客户端

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

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
		}

	}
}

运行结果:

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 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))
}

运行结果:

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

四、总结

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

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

你可能感兴趣的:(golang学习,golang)