在GOPATH 中创建 utils 文件夹 放置这两个文件
http.go
package utils
import (
"crypto/tls"
"encoding/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 string
SendType string
Header map[string]string
Body map[string]string
sync.RWMutex
}
func NewHttpSend(link string) *HttpSend {
return &HttpSend{
Link: link,
SendType: SENDTYPE_FROM,
}
}
func (h *HttpSend) SetBody(body map[string]string) {
h.Lock()
defer h.Unlock()
h.Body = body
}
func (h *HttpSend) SetHeader(header map[string]string) {
h.Lock()
defer h.Unlock()
h.Header = header
}
func (h *HttpSend) SetSendType(send_type string) {
h.Lock()
defer h.Unlock()
h.SendType = send_type
}
func (h *HttpSend) Get() ([]byte, error) {
return h.send(GET_METHOD)
}
func (h *HttpSend) Post() ([]byte, error) {
return h.send(POST_METHOD)
}
func GetUrlBuild(link string, data map[string]string) string {
u, _ := url.Parse(link)
q := u.Query()
for k, v := range data {
q.Set(k, v)
}
u.RawQuery = q.Encode()
return u.String()
}
func (h *HttpSend) send(method string) ([]byte, error) {
var (
req *http.Request
resp *http.Response
client http.Client
send_data string
err error
)
if len(h.Body) > 0 {
if strings.ToLower(h.SendType) == SENDTYPE_JSON {
send_body, json_err := json.Marshal(h.Body)
if json_err != nil {
return nil, json_err
}
send_data = string(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: true},
}
req, err = http.NewRequest(method, h.Link, strings.NewReader(send_data))
if err != nil {
return nil, err
}
defer req.Body.Close()
//设置默认header
if len(h.Header) == 0 {
//json
if strings.ToLower(h.SendType) == SENDTYPE_JSON {
h.Header = map[string]string{
"Content-Type": "application/json; charset=utf-8",
}
} else { //form
h.Header = map[string]string{
"Content-Type": "application/x-www-form-urlencoded",
}
}
}
for k, v := range h.Header {
req.Header.Set(k, v)
}
resp, err = client.Do(req)
if err != nil {
return nil, err
}
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.go
package utils
import (
"testing"
)
func Test_Get(t *testing.T) {
h := NewHttpSend(GetUrlBuild("http://127.0.0.1/test.php", map[string]string{"name": "xiaochuan"}))
_, err := h.Get()
if err != nil {
t.Error("请求错误:", err)
} else {
t.Log("正常返回")
}
}
func Test_Post(t *testing.T) {
h := NewHttpSend("http://127.0.0.1/test.php")
h.SetBody(map[string]string{"name": "xiaochuan"})
_, err := h.Post()
if err != nil {
t.Error("请求错误:", err)
} else {
t.Log("正常返回")
}
}
func Test_Json(t *testing.T) {
h := NewHttpSend("http://127.0.0.1/test.php")
h.SetSendType("JSON")
h.SetBody(map[string]string{"name": "xiaochuan"})
_, err := h.Post()
if err != nil {
t.Error("请求错误:", err)
} else {
t.Log("正常返回")
}
}
func Benchmark_GET(b *testing.B) {
for i := 0; i < b.N; i++ {
h := NewHttpSend(GetUrlBuild("http://127.0.0.1/test.php", map[string]string{"name": "xiaochuan"}))
_, err := h.Get()
if err != nil {
b.Error("请求错误:", err)
} else {
b.Log("正常返回")
}
}
}