Golang 自己封装下http get和post
封装
package helper
import (
"encoding/json"
"io"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
type JsonHttpClientHelper struct {
client *http.Client
}
func NewHttpClientHelper() *JsonHttpClientHelper {
return &JsonHttpClientHelper{
client: &http.Client{},
}
}
func NewHttpClientHelperFromClient(client *http.Client) *JsonHttpClientHelper {
return &JsonHttpClientHelper{
client: client,
}
}
// Get
// @Description: 发起Get请求
// @receiver clientHelper
// @param urlPath url请求绝对路径 https://www.***.com/users
// @param headers http请求头
// @param params url中附带的参数信息,最后会拼接到绝对路径上 如: https://www.***.com/users?name=u&age=18
// @return string 请求结果的字符串,推荐为 json格式
// @return error 请求发生的错误,需要捕获
//
func (clientHelper *JsonHttpClientHelper) Get(urlPath string, headers, params map[string]string) (string, error) {
//init url params
requestUrl, err := makeRequestUrl(urlPath, params)
if err != nil {
return "", err
}
req, err := makeRequest(requestUrl, headers, "GET", nil)
if err != nil {
return "", err
}
response, err := clientHelper.client.Do(req)
if err != nil {
return "", err
}
defer response.Body.Close()
//read from response
b, err := ioutil.ReadAll(response.Body)
if err != nil {
return "", err
}
return string(b), nil
}
func makeRequest(requestUrl *url.URL, headers map[string]string, method string, body io.Reader) (*http.Request, error) {
req, err := http.NewRequest(method, requestUrl.String(), body)
if err != nil {
return nil, err
}
//set header
for key, value := range headers {
req.Header.Add(key, value)
}
return req, nil
}
func makeRequestUrl(urlPath string, params map[string]string) (*url.URL, error) {
urlParams := url.Values{}
for key, value := range params {
urlParams.Set(key, value)
}
requestURI, err := url.ParseRequestURI(urlPath)
if err != nil {
return nil, err
}
requestURI.RawQuery = urlParams.Encode()
return requestURI, nil
}
// Post
// @Description: 发起POST请求
// @receiver clientHelper
// @param urlPath url请求绝对路径 https://www.***.com/users
// @param data 请求时需要传输的body
// @param headers http请求头 Content-Type只能为 application/x-www-form-urlencoded 或 application/json
// @param urlParams url中附带的参数信息,最后会拼接到绝对路径上 如: https://www.***.com/users?name=u&age=18
// @param bodyParams Content-Type为application/x-www-form-urlencoded 特殊片段
// @return string 请求结果的字符串,推荐为 json格式
// @return error 请求发生的错误,需要捕获
//
func (clientHelper *JsonHttpClientHelper) Post(urlPath string, data interface{}, headers, urlParams, bodyParams map[string]string) (string, error) {
//init url urlParams
requestUrl, err := makeRequestUrl(urlPath, urlParams)
if err != nil {
return "", err
}
var req *http.Request
if isJsonHttp(headers) {
bodyJsonStr, err := convertDataToJson(data)
if err != nil {
return "", err
}
req, err = makeRequest(requestUrl, headers, "POST", strings.NewReader(bodyJsonStr))
} else {
bodyUrlValues := makeRequestBodyForFormUpload(bodyParams)
req, err = makeRequest(requestUrl, headers, "POST", strings.NewReader(bodyUrlValues.Encode()))
if err != nil {
return "", err
}
}
response, err := clientHelper.client.Do(req)
if err != nil {
return "", err
}
defer response.Body.Close()
//read from response
b, err := ioutil.ReadAll(response.Body)
if err != nil {
return "", err
}
return string(b), nil
}
func makeRequestBodyForFormUpload(maps map[string]string) *url.Values {
values := url.Values{}
if maps != nil {
for key, value := range maps {
values.Set(key, value)
}
}
return &values
}
func isJsonHttp(headers map[string]string) bool {
v, ok := headers["Content-Type"]
if ok && v == "application/json" {
return true
}
if !ok {
return true
}
return false
}
func convertDataToJson(data interface{}) (string, error) {
bodyJsonByte, err := json.Marshal(data)
if err != nil {
return "", err
}
bodyJsonStr := string(bodyJsonByte)
if bodyJsonStr == "" || bodyJsonStr == "null" || bodyJsonStr == "NULL" || bodyJsonStr == "nil" {
bodyJsonStr = "{}"
}
return bodyJsonStr, nil
}
调用demo
package test
import (
"fmt"
"hello/src/helper"
"testing"
)
func TestHttpClient(t *testing.T) {
params := make(map[string]string, 10)
params["number"] = "99999"
resultJson, err := helper.NewHttpClientHelper().Post("http://127.0.0.1:6789/ping/call", nil, nil, params,nil)
if err != nil {
//
fmt.Println(err.Error())
} else {
fmt.Println(resultJson)
}
}
这样不需要自己每次都填充 httpHeader httpBody之类的

浙公网安备 33010602011771号