GO系列
10、
文章目录
前言
按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
在JAVA
中我们可以使用 HttpClient
来发起一个 Http
连接通过Tcp/Ip
协议来获取数据,不过在Spring
等框架中做了各种封装,例如RestTemplate
,OpenFeign
的组件,可以很方便的发起一个网络请求,也有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/resty
、github.com/parnurzeal/gorequest
等;HTTP 服务器库有 github.com/gin-gonic/gin
、github.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 语言的学习阶段,想必有一些地方考虑的不全面,本文示例全部是亲自手敲代码并且执行通过。
如有问题,还请指教。
评论去告诉我哦!!!一起学习一起进步!!!