GO系列
1、GO學(xué)習(xí)之Hello World
2、GO學(xué)習(xí)之入門(mén)語(yǔ)法
3、GO學(xué)習(xí)之切片操作
4、GO學(xué)習(xí)之 Map 操作
5、GO學(xué)習(xí)之 結(jié)構(gòu)體 操作
6、GO學(xué)習(xí)之 通道(Channel)
7、GO學(xué)習(xí)之 多線程(goroutine)
8、GO學(xué)習(xí)之 函數(shù)(Function)
9、GO學(xué)習(xí)之 接口(Interface)
10、GO學(xué)習(xí)之 網(wǎng)絡(luò)通信(Net/Http)
11、GO學(xué)習(xí)之 微框架(Gin)
12、GO學(xué)習(xí)之 數(shù)據(jù)庫(kù)(mysql)
13、GO學(xué)習(xí)之 數(shù)據(jù)庫(kù)(Redis)
14、GO學(xué)習(xí)之 搜索引擎(ElasticSearch)
15、GO學(xué)習(xí)之 消息隊(duì)列(Kafka)
16、GO學(xué)習(xí)之 遠(yuǎn)程過(guò)程調(diào)用(RPC)
17、GO學(xué)習(xí)之 goroutine的調(diào)度原理
前言
按照公司目前的任務(wù),go 學(xué)習(xí)是必經(jīng)之路了,雖然行業(yè)卷,不過(guò)技多不壓身,依舊努力!?。?br> 在JAVA
中我們可以使用 HttpClient
來(lái)發(fā)起一個(gè) Http
連接通過(guò)Tcp/Ip
協(xié)議來(lái)獲取數(shù)據(jù),不過(guò)在Spring
等框架中做了各種封裝,例如RestTemplate
,OpenFeign
的組件,可以很方便的發(fā)起一個(gè)網(wǎng)絡(luò)請(qǐng)求,也有SpringMVC
等框架供我們提供一個(gè)對(duì)外的接口。
那在 Go 語(yǔ)言中的網(wǎng)絡(luò)編程非常簡(jiǎn)單和強(qiáng)大,內(nèi)置了標(biāo)準(zhǔn)庫(kù)net/http
,提供了豐富的函數(shù)和類(lèi)型,用于發(fā)起Http
請(qǐng)求和 Http服務(wù)器。
一、HTTP服務(wù)端
下面示例實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的API接口訪問(wèn),首先定義一個(gè)函數(shù)(apiHandler)來(lái)處理請(qǐng)求,就類(lèi)似于
SpringMVC
中的 handler 請(qǐng)求處理器。
然后通過(guò)Go語(yǔ)言提供的標(biāo)準(zhǔn)庫(kù)中的net/http
包中的http
定義一個(gè)接口,配置接口名為/go
,配置接口監(jiān)聽(tīng)地址為127.0.0.1:8080
端口。
package main
import (
"fmt"
"net/http"
)
// 請(qǐng)求處理器函數(shù)
func apiHandler(response http.ResponseWriter, request *http.Request) {
fmt.Println(request.RemoteAddr, "連接成功!")
// 請(qǐng)求方式
fmt.Println("method:", request.Method)
// 請(qǐng)求路徑和參數(shù)
fmt.Println("url:", request.URL.Path)
fmt.Println("header:", request.Header)
fmt.Println("body", request.Body)
// 相應(yīng)
response.Write([]byte("Hello, 你好,歡迎訪問(wèn)?。。?))
}
func main() {
// 通過(guò) http 定義一個(gè)接口 http://127.0.0.1:8080/go
http.HandleFunc("/go", apiHandler)
// 監(jiān)聽(tīng)地址和端口
http.ListenAndServe("127.0.0.1:8080", nil)
}
運(yùn)行結(jié)果:
會(huì)發(fā)現(xiàn),get 和 post 兩種請(qǐng)求方式都支持。
二、HTTP客戶端
下面的示例中,用
net/http
包中的http
通過(guò)Get()
方法發(fā)起請(qǐng)求,返回結(jié)果賦值給resp
,并用defer
來(lái)延遲關(guān)閉連接。
定義一個(gè)byte
類(lèi)型數(shù)字,固定長(zhǎng)度 1024,從返回體中循環(huán)讀取數(shù)據(jù)給 buf,用string
函數(shù)包裝成字符串輸出。
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
resp, _ := http.Get("http://127.0.0.1:8080/go")
// 關(guān)閉連接, defer 延遲關(guān)閉
defer resp.Body.Close()
fmt.Println("請(qǐng)求狀態(tài):", resp.Status)
fmt.Println("請(qǐng)求頭:", resp.Header)
buf := make([]byte, 1024)
for {
// 接受服務(wù)器信息
n, err := resp.Body.Read(buf)
if err != nil && err != io.EOF {
fmt.Println("請(qǐng)求出錯(cuò):", err)
} else {
fmt.Println("請(qǐng)求成功!")
result := string(buf[:n])
fmt.Println("請(qǐng)求結(jié)果:", result)
break
}
}
}
運(yùn)行結(jié)果:
PS D:\workspaceGo\src\http> go run .\httpClient.go
請(qǐng)求狀態(tài): 200 OK
請(qǐng)求頭: map[Content-Length:[37] Content-Type:[text/plain; charset=utf-8] Date:[Sun, 06 Aug 2023 15:47:04 GMT]]
請(qǐng)求成功!
請(qǐng)求結(jié)果: Hello, 你好,歡迎訪問(wèn)?。?!
三、第三方的 HTTP 包
Go 語(yǔ)言還有許多第三方的 HTTP 客戶端和服務(wù)器庫(kù),可以幫助我們更方便地實(shí)現(xiàn) HTTP 請(qǐng)求和服務(wù)。一些常用的 HTTP 客戶端庫(kù)有 github.com/go-resty/resty
、github.com/parnurzeal/gorequest
等;HTTP 服務(wù)器庫(kù)有 github.com/gin-gonic/gin
、github.com/gorilla/mux
等。
這些庫(kù)提供了更多的功能和便利性,可以根據(jù)項(xiàng)目需求選擇適合的庫(kù)來(lái)使用。
我們首先創(chuàng)建了一個(gè)
resty
客戶端,然后使用R()
函數(shù)創(chuàng)建一個(gè)請(qǐng)求。接著使用 Get 方法發(fā)起一個(gè) GET 請(qǐng)求,并將響應(yīng)保存在response
變量中。我們檢查了響應(yīng)的狀態(tài)碼,如果狀態(tài)碼不是 200,表示請(qǐng)求失敗,我們就輸出相應(yīng)的提示信息。最后,我們獲取了響應(yīng)的內(nèi)容并輸出。
package main
import (
"fmt"
"gopkg.in/resty.v1"
)
func main() {
// 創(chuàng)建一個(gè)客戶端
client := resty.New()
// 發(fā)送 Get 請(qǐng)求
response, err := client.R().Get("http://127.0.0.1:8080/go")
if err != nil {
fmt.Println("請(qǐng)求失?。?, err)
return
}
// 請(qǐng)求響應(yīng)
if response.StatusCode() != 200 {
fmt.Println("請(qǐng)求失敗,狀態(tài)碼:", response.StatusCode())
return
}
// 獲取響應(yīng)內(nèi)容
body := response.Body()
fmt.Println("響應(yīng)結(jié)果:", string(body))
}
運(yùn)行結(jié)果:
PS D:\workspaceGo\src\http> go run .\httpResty.go
響應(yīng)結(jié)果: Hello, 你好,歡迎訪問(wèn)?。?!
四、總結(jié)
go-resty/resty 包提供了豐富的功能,包括發(fā)送 GET、POST、PUT、DELETE 等請(qǐng)求,處理請(qǐng)求和響應(yīng)的頭部、查詢參數(shù)、表單數(shù)據(jù)、JSON 數(shù)據(jù)等。它還支持連接池、超時(shí)設(shè)置、重試機(jī)制等功能,是一個(gè)非常強(qiáng)大和方便的 HTTP 請(qǐng)求庫(kù),特別適合在實(shí)際開(kāi)發(fā)中使用。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-645988.html
現(xiàn)階段還是對(duì) Go 語(yǔ)言的學(xué)習(xí)階段,想必有一些地方考慮的不全面,本文示例全部是親自手敲代碼并且執(zhí)行通過(guò)。
如有問(wèn)題,還請(qǐng)指教。
評(píng)論去告訴我哦?。。∫黄饘W(xué)習(xí)一起進(jìn)步?。?!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-645988.html
到了這里,關(guān)于GO學(xué)習(xí)之 網(wǎng)絡(luò)通信(Net/Http)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!