这篇文章给大家介绍使用golang语言怎么对http请求进行封装,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
在GOPATH中创建跑龙套文件夹放置这两个文件
http。去
package utils import ( ,“加密/tls" ,“编码/json" ,“errors" ,“fmt" ,“io/ioutil" ,“;net/http" ,“;net/url" ,“strings" ,“sync" ), var (=,GET_METHOD “GET"=,POST_METHOD “POST"=,SENDTYPE_FROM “from"=,SENDTYPE_JSON “json" ), type HttpSend struct { ,Link 字符串 SendType 字符串 Header map [string]字符串 ,Body map [string]字符串 ,sync.RWMutex }, func NewHttpSend (link 字符串),* HttpSend { ,return , HttpSend { 链接:,,才能链接, ,,SendType: SENDTYPE_FROM, ,} }, func (h * HttpSend), SetBody (body map [string]字符串),{ ,h.Lock () ,defer h.Unlock () h.Body =,身体 }, func (h * HttpSend), SetHeader (header map [string]字符串),{ ,h.Lock () ,defer h.Unlock () h.Header =,头 }, func (h * HttpSend), SetSendType (send_type 字符串),{ ,h.Lock () ,defer h.Unlock ()=,h.SendType send_type }, func (h * HttpSend),有(),([]字节,,错误),{ ,return h.send (GET_METHOD) }, func (h * HttpSend), Post(),([]字节,,错误),{ ,return h.send (POST_METHOD) }, 字符串,func GetUrlBuild (link data map [string]字符串),string { ,u, _ :=, url.Parse(链接) ,q :=, u.Query () ,for k, v :=, range data { q.Set才能(k, v) ,}=,,u.RawQuery q.Encode () ,return u.String () }, func (h * HttpSend),发送(method 字符串),([]字节,,错误),{ ,var ( req 才能;* http.Request resp 才能;* http.Response client http.Client才能 send_data 才能;字符串 err 才能;错误 ,) ,if len (h.Body),祝辞,0,{ if 才能strings.ToLower (h.SendType),==, SENDTYPE_JSON { ,,,json_err send_body:=, json.Marshal (h.Body) ,,if json_err !=, nil { ,,,return nil, json_err ,,} ,,send_data =,字符串(send_body) ,,},{else ,,send_body :=, http.Request {} ,,send_body.ParseForm () ,,for k, v :=, range h.Body { ,,,send_body.Form.Add (k, v) ,,} ,,send_data =, send_body.Form.Encode () ,,} }大敌; ,//忽略https的证书=,client.Transport , http.Transport { TLSClientConfig才能:,,tls.Config} {InsecureSkipVerify:如此, }大敌; ,点播,err =, http.NewRequest(方法,h.Link,, strings.NewReader (send_data)) ,if err !=, nil { return 才能nil,犯错 ,} ,defer req.Body.Close () , ,//设置默认头 ,if len (h.Header),==, 0, { ,//json if 才能strings.ToLower (h.SendType),==, SENDTYPE_JSON { ,,h.Header =, map [string]字符串{ ,,,“Content-Type":,“application/json; charset=utf-8", ,,} ,,},else {//形式 ,,h.Header =, map [string]字符串{ ,,,“Content-Type":,“应用程序/x-www-form-urlencoded" ,,} ,,} }大敌; ,for k, v :=, range h.Header { if 才能strings.ToLower (k),==,“host", { ,,req.Host =v ,,},{else ,,req.Header.Add (k, v) ,,} }大敌; 职责的不同之处是,err =, client.Do(要求) ,if err !=, nil { return 才能nil,犯错 ,} ,defer resp.Body.Close () , ,if resp.StatusCode !=, http.StatusOK { return nil,才能,errors.New (fmt.Sprintf (“error http code : % d",, resp.StatusCode)) }大敌; ,return ioutil.ReadAll (resp.Body) }http_test。去
package utils import ( ,“testing" ), func Test_Get (t * testing.T), { null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null