golang的http客戶端封裝

簡介

net/httpGo 語言標準庫的一部分,它提供了創建 HTTP 客戶端和服務器的能力。這個包通過簡化與 HTTP 協議的交互,讓開發者能夠方便地構建 HTTP 請求和響應,以及處理路由等任務。

本文以 net/http 包作為底層,封裝一個包含 get , post , form-data 請求的工具包

開始

創建一個項目 demo ,并創建以下目錄:

在這里插入圖片描述

GET方法

client 文件中創建如下方法

package clientimport ("bytes""crypto/tls""fmt""io/ioutil""net/http""net/url""time"
)/***
url 請求地址
header 頭部
requestData 請求數據
*/
func GET(path string,header map[string]string, requestData map[string]string) []byte  {if(len(requestData) >0){params := url.Values{}for k,v:=range requestData{params.Add(k,v)}path = path + "?" + params.Encode()}req, _ := http.NewRequest("GET", path, bytes.NewBuffer([]byte("")))req.Header.Set("cache-control", "no-cache")for key,value :=range header{req.Header.Set(key, value)}//過濾https證書tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true},//關閉連接池,不然會打滿語句柄DisableKeepAlives: true,}//設置請求超時時間為20秒client := &http.Client{Transport: tr,Timeout: 20 * time.Second,}res, err := client.Do(req)if res !=nil{defer res.Body.Close()body, _ := ioutil.ReadAll(res.Body)return body}if err !=nil {fmt.Printf("請求錯誤: %s\n", err.Error())return nil}return nil
}

注意:此處需要關閉連接池,不然在多攜程異步調用的時候,由于請求過多,會出現語句餅打滿,導致請求報錯的情況。

POST


/***
url 請求地址
header 頭部
requestData 請求數據,json數據
*/
func POST(path string,header map[string]string, requestData []byte) []byte  {req, _ := http.NewRequest("POST", path, bytes.NewBuffer(requestData))req.Header.Set("cache-control", "no-cache")_, ok := header["content-type"]if ok ==false {req.Header.Set("content-type", "application/json")}for key,value :=range header{req.Header.Set(key, value)}//過濾https證書tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true},//關閉連接池,不然會打滿語句柄DisableKeepAlives: true,}//設置請求超時時間為20秒client := &http.Client{Transport: tr,Timeout: 20 * time.Second,}res, err := client.Do(req)if res !=nil{defer res.Body.Close()body, _ := ioutil.ReadAll(res.Body)return body}if err !=nil {fmt.Printf("請求錯誤: %s\n", err.Error())return nil}return nil
}

FormData

/***
url 請求地址
header 頭部
params 其他請求參數
paramName 文件名稱
path 本地文件路徑
*/
func FormData(url string,header map[string]string,params map[string]string, paramName, path string) []byte {file, err := os.Open(path)if err != nil {fmt.Printf("打開文件錯誤: %s\n", err.Error())return nil}defer file.Close()body := &bytes.Buffer{}writer := multipart.NewWriter(body)//fmt.Printf("請求參數:%+v",params)part, err := writer.CreateFormFile(paramName, filepath.Base(path))if err != nil {fmt.Printf("文件錯誤: %s\n", err.Error())return nil}_, err = io.Copy(part, file)for key, val := range params {_ = writer.WriteField(key, val)}err = writer.Close()if err != nil {fmt.Printf("文件關閉錯誤: %s\n", err.Error())return nil}req, err := http.NewRequest("POST", url, body)req.Header.Set("Content-Type", writer.FormDataContentType())for key,value :=range header{req.Header.Set(key, value)}//過濾https證書tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true},//關閉連接池,不然會打滿語句柄DisableKeepAlives: true,}//設置請求超時時間為20秒client := &http.Client{Transport: tr,Timeout: 20 * time.Second,}res, err := client.Do(req)if res !=nil{defer res.Body.Close()body, _ := ioutil.ReadAll(res.Body)return body}if err !=nil {fmt.Printf("請求錯誤: %s\n", err.Error())return nil}return nil
}

Request

/***
url 請求地址
header 頭部
requestData 請求數據
method 請求方法
*/
func Request(url string,header map[string]string, requestData []byte, method string) []byte{//rwLock.Lock()//payload := strings.NewReader(requestData)req, _ := http.NewRequest(method, url, bytes.NewBuffer(requestData))//req.Header.Set("content-type", "application/json")req.Header.Set("cache-control", "no-cache")for key,value :=range header{req.Header.Set(key, value)}//過濾https證書tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true},//關閉連接池,不然會打滿語句柄DisableKeepAlives: true,}//設置請求超時時間為20秒client := &http.Client{Transport: tr,Timeout: 20 * time.Second,}res, err := client.Do(req)if res !=nil{defer res.Body.Close()body, _ := ioutil.ReadAll(res.Body)return body}if err !=nil {fmt.Printf("請求錯誤: %s\n", err.Error())return nil}return nil}

測試

新建 main.go 文件寫入以下內容:


func main()  {sendData :=make(map[string]string)sendData["name"]="測試"sendData["sex"]="男"jsonStr,_:=json.Marshal(sendData)//此處需要換成你自己的接口地址httpUrl:="https://xxxxx/api/test"headerData :=make(map[string]string)headerData["X-Ca-Key"]="22527885"headerData["Content-Type"]="application/json;charset=UTF-8"headerData["Accept"]="application/json"body:=client.POST(httpUrl,headerData,jsonStr)fmt.Printf("請求成功返回:%s\n",body)}

執行命令:

go run main.go

總結

本文對 net/http 包的簡單封裝,使用者可以直接拿來用,減少了開發成本。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21564.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21564.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21564.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTCC電路板是什么,有哪些主要應用領域

HTCC英文名稱是High-Temperature Co-Fired Ceramic,又稱高溫共燒多層陶瓷基板。因其具有導熱系數高、耐熱性好、熱膨脹系數小、機械強度高、絕緣性好、耐腐蝕等優勢,是保持高速增加的PCB線路板之一。 SPEA作為專業電路板測試設備方案服務商,公…

FY-SA-20237·8-WhyWeSpin

Translated from the Scientific American, July/August 2023 issue. Why We Spin (我們為什么旋轉) Primates may play with reality by twirling around 翻譯:靈長類動物有能力通過旋轉或旋轉運動來操縱或扭曲他們對現實的感知。 解釋: “Primates”…

Java生成指定長度驗證碼

生成指定長度驗證碼的簡單思路在Java中通常涉及以下幾個步驟: 1、定義字符池: 首先,需要定義一個包含所有可能字符的字符串,這個字符池通常包括數字(0-9)、大寫字母(A-Z)、小寫字母(a-z)。 例如: String chars "…

【開發心得】三步本地化部署llama3大模型

目錄 第一步:啟動ollama 第二步:啟動dify 第三步:配置模型(截圖) 最近llama3很火,本文追擊熱點,做一個本地化部署的嘗試,結果還成功了! 當然也是站在別人的肩膀上&…

【運維項目經歷|027】PXE自動化部署與管理平臺

🍁博主簡介: 🏅云計算領域優質創作者 🏅2022年CSDN新星計劃python賽道第一名 🏅2022年CSDN原力計劃優質作者 🏅阿里云ACE認證高級工程師 🏅阿里云開發者社區專…

Nginx企業級負載均衡:技術詳解系列(18)—— 作為上傳服務器

你好,我是趙興晨,97年文科程序員。 在上一期的技術分享中,我們探討了如何高效搭建Nginx下載服務器,并討論了長連接優化策略。那么今天,咱們進一步了解Nginx的另一面——作為上傳服務器的配置技巧。 作為上傳服務器&a…

怎么做好企業短信服務呢?(文字短信XML接口示例)

企業短信服務已經成為各行各業都信賴的行業推廣方式之一,并且短信行業也與時俱進的發展著,隨之而來的就是市場上短信平臺的數量也隨之增多。那么怎么在魚龍混雜的短信行業中選擇適合自己的企業短信服務平臺呢?企業短信服務平臺又適用于哪些應…

Django的PATH路徑轉換器

本書1-7章樣章及配套資源下載鏈接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源碼、PPT課件、教學視頻等,可以從前言給出的下載信息下載,大家可以評估一下。 在Django框架中,默認內置了一組PATH路徑轉換器,具…

第一篇【傳奇開心果系列】AI工業應用經典算法和Python示例:基于AI的智能制造技術經典算法與Python實踐

傳奇開心果博文系列 系列博文目錄AI工業應用經典算法和Python示例系列 博文目錄前言一、AI在智能制造方面的應用場景介紹二、基于AI的智能制造技術經典算法介紹三、支持向量機機器學習算法Python示例代碼四、隨機森林機器學習算法Python示例代碼五、深度學習算法Python示例代碼…

linux指令-高階指令用法

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、pandas是什么?二、使用步驟 1.引入庫2.讀入數據總結 前言 linux操作系統的環境變量的使用基礎需要先了解 提示:以下是本篇文章正文…

【linux】(2)文件內容排序sort

sort 是一個用于排序文件內容的命令行工具,在 Linux 和 Unix 系統中非常常用。 基本用法 sort [OPTION]... [FILE]...常用選項 按數值排序 -n sort -n filename例子:對包含數值的文件進行排序。 按字典順序排序 -d sort -d filename例子&#xff1…

大宋咨詢(深圳酒店神秘顧客調查)酒店客房神秘人體驗調查內容

酒店客房神秘檢查內容,是酒店管理中至關重要的環節。通過專業的神秘顧客對客房進行細致入微的檢查,可以確保客房的清潔度、設施設備的完好性以及服務質量等方面達到高標準,幫助他們更好地了解客戶的需求和滿意度,從而提高服務質量…

Facebook開戶|Facebook公共主頁疑難雜癥詳解

??要要切克鬧,公共主頁我來道...哈嘍呀家人們中午好,上一次學習還是在上一次..hhh相信很多家人在做Facebook的時候總會遇到各種各樣匪夷所思的bug!經常被搞心態吧!那么咱們今天呢就來總結一下各類的bug以及解決方法,…

InvokeAI學習教程三:換臉

啟動InvokeAI,我們先生成一張圖: 在正向提示詞里輸入:Avant-garde couture, tactile textures, vogue aesthetics, vibrant color palette, intricate embroidery details, dramatic silhouettes 生成一張高貴夫人的圖像, 或者你從…

標準發布 | 廢水處理減污降碳協同評估指南(碳中和標準)

本文件主編單位:北京林業大學、北京交通大學、中國電建集團華東勘測設計研究院有限公司、 眉山市城投中恒能環保科技有限公司、 中華環保聯合會水環境治理專業委員會。 本文件參編單位:中國市政工程中南設計研究總院有限公司、湖北君集環境科技股份有 公…

C++ B (1124) : 斐波那契數列第n項Plus

文章目錄 一、題目描述二、參考代碼 一、題目描述 二、參考代碼 #include <iostream> #include <vector>using namespace std;const long long MOD 1e9 7; // 取模的值// 定義矩陣類 class Matrix { public:vector<vector<long long>> data;// 構造…

JavaWeb項目規范開發流程詳細分解

在JavaWeb項目開發中&#xff0c;遵循規范化的開發流程和最佳實踐可以提高代碼的可維護性、可擴展性和團隊協作效率。規范化的開發流程主要從下面幾個方面進行&#xff1a; 1. 項目結構 分層架構&#xff1a;典型的分層架構包括表示層&#xff08;Controller&#xff09;、業…

字節裁員!開啟裁員新模式。。

最近&#xff0c;互聯網圈不太平&#xff0c;裁員消息此起彼伏。而一向以“狼性文化”著稱的字節跳動&#xff0c;卻玩起了“低調裁員”&#xff0c;用一種近乎“溫柔”的方式&#xff0c;慢慢擠掉“冗余”的員工。 “細水長流”&#xff1a;裁員新模式&#xff1f; 不同于以往…

【TB作品】MSP430F5529,單片機,打地鼠游戲

功能 針對這塊開發板做了一個打地鼠游戲&#xff1a; 1 給單片機上電后&#xff0c;初始化顯示界面&#xff0c;顯示出分數和等級。 2 游戲是一輪一輪進行的&#xff0c;每一輪會以50%幾率點亮板子上的五個小燈&#xff0c;表示地鼠露頭需要打了。 3 一輪游戲開始后&#xff…

亞馬遜又爆單了!做跨境電商就是靠選品!

其實亞馬遜運營并不難&#xff0c;只要遵循亞馬遜規則去做就不會有問題&#xff0c;亞馬遜規則其實就是運營&#xff0c;但是&#xff01;難就難在選品&#xff01;我自己是做精品的&#xff0c;我自己明顯的感覺就是&#xff0c;運營技術很厲害&#xff0c;但是好的產品面前一…