From ebd6497f7eaf0cb29001245f8d685ad1775cf193 Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期四, 20 六月 2019 10:34:28 +0800
Subject: [PATCH] first vervion

---
 gb28181Api.go    |  224 ++++++++++++++++++++++
 client.go        |   30 +++
 clientFactory.go |    9 
 entites.go       |   75 +++++++
 httpClient.go    |  155 +++++++++++++++
 README.md        |    3 
 api_test.go      |   68 ++++++
 7 files changed, 564 insertions(+), 0 deletions(-)

diff --git a/README.md b/README.md
index 8629046..6200a02 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,6 @@
 
 鍥芥爣28181鐨刟pi
 
+API:gb28181Api.go
+浼犺緭锛歨ttpClient.go
+浣跨敤鎺ュ彛鍓嶉渶瑕佹墽琛孖nit()锛屾寚瀹歩p+port
diff --git a/api_test.go b/api_test.go
new file mode 100644
index 0000000..ccd45f4
--- /dev/null
+++ b/api_test.go
@@ -0,0 +1,68 @@
+package gb28181api
+
+import (
+	"fmt"
+	"testing"
+)
+
+func TestSetPlatformServerInfo(t *testing.T) {
+	var api Gb28181Api
+	var gbserverinfo = GbServerInfo{
+		Name:           "娴嬭瘯鍥芥爣骞冲彴",
+		PublicID:       "44120000002000000011",
+		GbServerPort:   7060,
+		RtspServrPort:  7554,
+		HTTPClientIP:   "",
+		HTTPClientPort: 0,
+	}
+	Init("192.168.1.203", 8060)
+	flag := api.SetPlatformServerInfo(gbserverinfo)
+	fmt.Println(flag)
+}
+
+func TestGetPlatformServerInfo(t *testing.T) {
+	var api Gb28181Api
+	Init("192.168.1.203", 8060)
+	gbserverinfo, flag := api.GetPlatformServerInfo()
+	fmt.Println("flag:", flag)
+	fmt.Println("gbserverinfo:", SmartPrintStruct(gbserverinfo))
+}
+
+func TestGetDevicesByPageNO(t *testing.T) {
+	var api Gb28181Api
+	Init("192.168.1.203", 8060)
+	devsinfo, flag := api.GetDevicesByPageNO(1)
+	fmt.Println("flag:", flag)
+	fmt.Println("devsinfo:", SmartPrintStruct(devsinfo))
+}
+
+func TestGetAllDevices(t *testing.T) {
+	var api Gb28181Api
+	Init("192.168.1.203", 8060)
+	alldevsinfo, flag := api.GetAllDevices()
+	fmt.Println("flag:", flag)
+	fmt.Println("alldevsinfo:", SmartPrintStruct(alldevsinfo))
+}
+
+func TestGetCamsByDevAndPage(t *testing.T) {
+	var api Gb28181Api
+	Init("192.168.1.203", 8060)
+	camsinfo, flag := api.GetCamsByDevAndPage("44122500042001000123", "all", 1)
+	fmt.Println("flag:", flag)
+	fmt.Println("camsinfo:", SmartPrintStruct(camsinfo))
+}
+
+func TestGetAllCamerasByDevID(t *testing.T) {
+	var api Gb28181Api
+	Init("192.168.1.203", 8060)
+	allcamsinfo, flag := api.GetAllCamerasByDevID("44122500042001000123")
+	fmt.Println("flag:", flag)
+	fmt.Println("allcamsinfo:", SmartPrintStruct(allcamsinfo))
+}
+
+func TestSetCameraPtz(t *testing.T) {
+	var api Gb28181Api
+	Init("192.168.1.203", 8060)
+	flag := api.SetCameraPtz("11010202081314000004", "focusnear", 150)
+	fmt.Println("flag:", flag)
+}
diff --git a/client.go b/client.go
new file mode 100644
index 0000000..9ececca
--- /dev/null
+++ b/client.go
@@ -0,0 +1,30 @@
+package gb28181api
+
+import (
+	"strconv"
+)
+
+type Client interface {
+	//GET
+	DoGetRequest(url string, params map[string]string, headers map[string]string) ([]byte, error)
+	//POST
+	DoPostRequest(url string, contentType string, body map[string]interface{}, params map[string]string, headers map[string]string) ([]byte, error)
+	//PUT
+	DoPutRequest(url string, contentType string, body map[string]interface{}, headers map[string]string) ([]byte, error)
+	//DELETE
+	DoDeleteRequest(url string, contentType string, body map[string]interface{}, headers map[string]string) ([]byte, error)
+}
+
+var BASIC_URL = "http://192.168.1.203:8060"
+
+const (
+	DATA_URL_PREFIX      = "/vssconfig"
+	CONTENT_TYPE_FORM    = "application/x-www-form-urlencoded"
+	CONTENT_TYPE_MULFORM = "multipart/form-data"
+	CONTENT_TYPE_JSON    = "application/json"
+)
+
+//鍒濆鍖杁bserver鐨勫湴鍧�鍜岀鍙�
+func Init(ip string, port int) {
+	BASIC_URL = "http://" + ip + ":" + strconv.Itoa(port)
+}
diff --git a/clientFactory.go b/clientFactory.go
new file mode 100644
index 0000000..1cc67ca
--- /dev/null
+++ b/clientFactory.go
@@ -0,0 +1,9 @@
+package gb28181api
+
+//Factory new client
+func NewClient() Client {
+	var client Client
+	client = &HttpClient{}
+	//client = &ReqRepClient{}
+	return client
+}
diff --git a/entites.go b/entites.go
new file mode 100644
index 0000000..daf3d57
--- /dev/null
+++ b/entites.go
@@ -0,0 +1,75 @@
+package gb28181api
+
+//GbServerInfo 鍥芥爣骞冲彴淇℃伅
+type GbServerInfo struct {
+	Name           string `json:"name"`           //鍥芥爣骞冲彴鐨勫悕绉�
+	PublicID       string `json:"publicid"`       //鍥芥爣骞冲彴鐨�20浣岻D 锛�200绫诲瀷锛�
+	GbServerPort   int    `json:"gbserverport"`   //鍥芥爣骞冲彴鐩戝惉鐨勭鍙�
+	RtspServrPort  int    `json:"rtspservrport"`  //RTSP鏈嶅姟鐨勭鍙�
+	HTTPClientIP   string `json:"httpclientip"`   //HTTP瀹㈡埛绔殑ip锛堢敤浜庢姤璀﹂�氱煡锛屼竴鑸笉璁剧疆锛�
+	HTTPClientPort int    `json:"httpclientport"` //HTTP瀹㈡埛绔殑绔彛锛堢敤浜庢姤璀﹂�氱煡锛屼竴鑸笉璁剧疆锛�
+}
+
+//GbResult 杩斿洖鍊间俊鎭�
+type GbResult struct {
+	ErrCode int    `json:"errcode"`
+	ErrDesc string `json:"errdesc"`
+}
+
+//DeviceInfo 涓嬬骇璁惧淇℃伅
+type DeviceInfo struct {
+	PublicID string `json:"publicid"` //(瀛楃涓�)   鍥芥爣璁惧20浣峣d
+	Name     string `json:"name"`     //(瀛楃涓�)   璧勬簮鍚嶇О
+	Alive    int    `json:"alive"`    //(鏁板瓧) 	   鐘舵�� 0锛氫笉鍦ㄧ嚎 1锛氬湪绾�
+	Corp     string `json:"corp"`     //(瀛楃涓�)   鍘傚晢
+	Parentid string `json:"parentid"` //(瀛楃涓�)   鐖惰妭鐐筰d
+	IP       string `json:"ip"`       //(瀛楃涓�)   ip鍦板潃
+	Port     int    `json:"port"`     //(鏁板瓧)     绔彛
+	Username string `json:"username"` //(瀛楃涓�)   璁惧娉ㄥ唽鐢ㄦ埛鍚�
+	Passwd   string `json:"passwd"`   //(瀛楃涓�)   璁惧娉ㄥ唽瀵嗙爜
+	Devmode  string `json:"devmode"`  //(瀛楃涓�)   璁惧绫诲瀷
+}
+
+//DevicesInOnePage 涓�椤电殑涓嬬骇璁惧淇℃伅
+type DevicesInOnePage struct {
+	GbResult
+	TotalSize   int          `json:"totalsize"`   //(鏁板瓧)   璁惧鎬绘暟  锛堜笅鍚岋級
+	OnePageSize int          `json:"onepagesize"` //(鏁板瓧)   姣忛〉澶у皬  锛堜笅鍚岋級
+	TotalPage   int          `json:"totalpage"`   //(鏁板瓧)   鎬诲垎椤垫暟  锛堜笅鍚岋級
+	PageNO      int          `json:"pageno"`      //(鏁板瓧)   褰撳墠绗嚑椤碉紙涓嬪悓锛�
+	Count       int          `json:"count"`       //(鏁板瓧)   褰撳墠鏈夊嚑鏉℃暟鎹紙涓嬪悓锛�
+	Data        []DeviceInfo `json:"data"`        //璁惧淇℃伅锛屽弬鐓р��1.璁惧绠$悊鈥濆畾涔�
+}
+
+//CameraInfo 鎽勫儚鏈轰俊鎭�
+type CameraInfo struct {
+	ResType     int     `json:"restype"`     //(鏁板瓧)	 1-閫氶亾璧勬簮 2-璧勬簮缁�
+	PublicID    string  `json:"publicid"`    //(瀛楃涓�)   鍥芥爣璧勬簮閫氶亾20浣峣d 锛堢敤浜庤姹傝棰戙�佹帶鍒剁瓑鎿嶄綔锛�
+	Name        string  `json:"name"`        //(瀛楃涓�)   璧勬簮鍚嶇О
+	Alive       int     `json:"alive"`       //(鏁板瓧) 	 鐘舵�� 0锛氫笉鍦ㄧ嚎 1锛氬湪绾�
+	Corp        string  `json:"corp"`        //(瀛楃涓�) 	 鍘傚晢
+	Model       string  `json:"model"`       //(瀛楃涓�)   璁惧绫诲瀷
+	Owner       string  `json:"owner"`       //(瀛楃涓�)   璁惧褰掑睘
+	CivilCode   string  `json:"civilcode"`   //(瀛楃涓�) 	 琛屾斂鍖哄煙 锛堝彲浠ユ寜鐓ц鏀垮尯鍩熻繘琛屽垝鍒嗚祫婧愮粍锛�
+	Address     string  `json:"address"`     //(瀛楃涓�) 	 鍦板潃
+	DevPubID    string  `json:"devpubid"`    //(瀛楃涓�) 	 閫氶亾鐨勮澶噄d
+	ParentID    string  `json:"parentid"`    //(瀛楃涓�) 	 鐖惰妭鐐筰d
+	IP          string  `json:"ip"`          //(瀛楃涓�)   ip鍦板潃
+	Port        int     `json:"port"`        //(鏁板瓧)     绔彛
+	Longitude   float64 `json:"longitude"`   //(鏁板瓧)     缁忓害
+	Latitude    float64 `json:"latitude"`    //(鏁板瓧)     绾害
+	PtzType     int     `json:"ptztype"`     //(鏁板瓧)     鎺у埗绫诲瀷 1-鐞冩満锛�2-鍗婄悆锛�3-鍥哄畾鏋満锛�4-閬ユ帶鏋満锛�
+	StreamType  int     `json:"streamtype"`  //(鏁板瓧)     鐮佹祦绫诲瀷 0-H264锛�1-MPEG2锛�2-MPEG4锛�3-SVAC锛�4-3GP锛�5-H265锛�
+	RealRtspURL string  `json:"realrtspurl"` //(瀛楃涓�)   瀹炴椂瑙嗛鐨剅tsp鍦板潃
+}
+
+//CamerasInOnePage 涓�椤电殑鎽勫儚鏈轰俊鎭�
+type CamerasInOnePage struct {
+	GbResult
+	TotalSize   int          `json:"totalsize"`   //(鏁板瓧)   璁惧鎬绘暟  锛堜笅鍚岋級
+	OnePageSize int          `json:"onepagesize"` //(鏁板瓧)   姣忛〉澶у皬  锛堜笅鍚岋級
+	TotalPage   int          `json:"totalpage"`   //(鏁板瓧)   鎬诲垎椤垫暟  锛堜笅鍚岋級
+	PageNO      int          `json:"pageno"`      //(鏁板瓧)   褰撳墠绗嚑椤碉紙涓嬪悓锛�
+	Count       int          `json:"count"`       //(鏁板瓧)   褰撳墠鏈夊嚑鏉℃暟鎹紙涓嬪悓锛�
+	Data        []CameraInfo `json:"data"`        //璁惧淇℃伅锛屽弬鐓р��1.璁惧绠$悊鈥濆畾涔�
+}
diff --git a/gb28181Api.go b/gb28181Api.go
new file mode 100644
index 0000000..4093c7b
--- /dev/null
+++ b/gb28181Api.go
@@ -0,0 +1,224 @@
+package gb28181api
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"strconv"
+)
+
+func SmartPrintStruct(src interface{}) string {
+	b, err := json.Marshal(src)
+	if err != nil {
+		return fmt.Sprintf("%+v", src)
+	}
+	var out bytes.Buffer
+	err = json.Indent(&out, b, "", "    ")
+	if err != nil {
+		return fmt.Sprintf("%+v", src)
+	}
+	return out.String()
+}
+
+type Gb28181Api struct{}
+
+//SetPlatformServerInfo 璁剧疆鏈嶅姟鍣ㄤ俊鎭�
+func (api Gb28181Api) SetPlatformServerInfo(serverInfo GbServerInfo) bool {
+	url := BASIC_URL + DATA_URL_PREFIX + "/set_platform_server"
+	client := NewClient()
+
+	paramBody := make(map[string]string, 0)
+	paramBody["gbsvrid"] = serverInfo.PublicID
+	paramBody["gbsvrport"] = strconv.Itoa(serverInfo.GbServerPort)
+	paramBody["gbsvrname"] = serverInfo.Name
+	paramBody["rtspsvrport"] = strconv.Itoa(serverInfo.RtspServrPort)
+
+	// fmt.Println("url:", url)
+	body, err := client.DoGetRequest(url, paramBody, nil)
+	if err != nil {
+		return false
+	}
+
+	var res GbResult
+	// fmt.Println("body", string(body))
+	if err = json.Unmarshal(body, &res); err != nil {
+		fmt.Println("jsonErr:", err)
+		return false
+	}
+
+	if res.ErrCode != 0 {
+		fmt.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
+		return false
+	}
+
+	return true
+}
+
+type retGbServerInfo struct {
+	GbServerInfo
+	GbResult
+}
+
+//GetPlatformServerInfo 鑾峰彇鏈嶅姟鍣ㄤ俊鎭�
+func (api Gb28181Api) GetPlatformServerInfo() (GbServerInfo, bool) {
+	url := BASIC_URL + DATA_URL_PREFIX + "/get_platform_server"
+	client := NewClient()
+
+	var info GbServerInfo
+	body, err := client.DoGetRequest(url, nil, nil)
+	if err != nil {
+		fmt.Println("err:", err)
+		return info, false
+	}
+
+	//瑙f瀽retGbServerInfo
+	var res retGbServerInfo
+	if err = json.Unmarshal(body, &res); err != nil {
+		fmt.Println("jsonErr:", err)
+		return info, false
+	}
+	if res.ErrCode != 0 {
+		fmt.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
+		return info, false
+	}
+
+	return res.GbServerInfo, true
+}
+
+//GetDevicesByPageNO 鎸夐〉鑾峰彇涓嬬骇璁惧锛堝钩鍙版垨鎽勫儚鏈猴級鍒楄〃
+//pageNo (鏁板瓧)   鎸囧畾鑾峰彇绗嚑椤碉紝绗竴娆′负1锛岃繑鍥炴�婚〉鏁帮紝鎬绘潯鏁扮瓑锛屽啀鏍规嵁杩欎簺淇℃伅鍘诲啀娆℃煡璇紝鐩村埌鍙栧畬鍏ㄩ儴
+func (api Gb28181Api) GetDevicesByPageNO(pageNo int) (DevicesInOnePage, bool) {
+	url := BASIC_URL + DATA_URL_PREFIX + "/get_all_device/" + strconv.Itoa(pageNo)
+	client := NewClient()
+
+	var devicesPerPage DevicesInOnePage
+	body, err := client.DoGetRequest(url, nil, nil)
+	if err != nil {
+		fmt.Println("err:", err)
+		return devicesPerPage, false
+	}
+
+	//瑙f瀽 DevicesInOnePage
+	if err = json.Unmarshal(body, &devicesPerPage); err != nil {
+		fmt.Println("jsonErr:", err)
+		return devicesPerPage, false
+	}
+	if devicesPerPage.ErrCode != 0 {
+		fmt.Println("errcode: ", devicesPerPage.ErrCode, " errdesc: ", devicesPerPage.ErrDesc)
+		return devicesPerPage, false
+	}
+
+	return devicesPerPage, true
+}
+
+//GetAllDevices 鑾峰彇鍏ㄩ儴涓嬬骇璁惧锛堝钩鍙版垨鎽勫儚鏈猴級淇℃伅鍒楄〃
+func (api Gb28181Api) GetAllDevices() ([]DeviceInfo, bool) {
+	var deviceSlice []DeviceInfo
+	devicesPerPage, flag := api.GetDevicesByPageNO(1)
+	if !flag {
+		fmt.Println("GetDevicesByPageNO Error, deviceSlice is nil")
+		return deviceSlice, false
+	}
+	deviceSlice = devicesPerPage.Data
+
+	for i := 1; i < devicesPerPage.TotalPage; i++ {
+		devicesPerPage, flag := api.GetDevicesByPageNO(i + 1)
+		if !flag {
+			fmt.Println("GetDevicesByPageNO Error,pageno:" + strconv.Itoa(i+1) + " ,deviceSlice is not completed")
+			return deviceSlice, false
+		}
+		deviceSlice = append(deviceSlice, devicesPerPage.Data...)
+	}
+
+	return deviceSlice, true
+}
+
+//GetCamsByDevAndPage 鎸夐〉鑾峰彇涓嬬骇璁惧鐨勬憚鍍忔満鍒楄〃
+//devID  (瀛楃涓�)  娉ㄥ唽鐨勮澶囩殑20浣峣d
+//pageNo (鏁板瓧)   鎸囧畾鑾峰彇绗嚑椤碉紝绗竴娆′负1锛岃繑鍥炴�婚〉鏁帮紝鎬绘潯鏁扮瓑锛屽啀鏍规嵁杩欎簺淇℃伅鍘诲啀娆℃煡璇紝鐩村埌鍙栧畬鍏ㄩ儴
+//srcType (瀛楃涓�) "all"-琛ㄧず鑾峰彇璁惧鐨勬墍鏈夎祫婧�  "node"-鐖惰妭鐐逛笅鐨勭涓�绾ц祫婧�
+//娉ㄦ剰锛氭牴鎹�"restype"瀛楁锛屽拷鐣ヨ祫婧愮粍锛屽彧淇濈暀閫氶亾璧勬簮------"restype"锛�(鏁板瓧)1-閫氶亾璧勬簮 2-璧勬簮缁�
+func (api Gb28181Api) GetCamsByDevAndPage(devID string, srcType string, pageNo int) (CamerasInOnePage, bool) {
+	url := BASIC_URL + DATA_URL_PREFIX + "/get_all_channel/" + devID + "/" + srcType + "/" + strconv.Itoa(pageNo)
+	client := NewClient()
+
+	var camerasPerPage CamerasInOnePage
+	body, err := client.DoGetRequest(url, nil, nil)
+	if err != nil {
+		fmt.Println("err:", err)
+		return camerasPerPage, false
+	}
+
+	//瑙f瀽 CamerasInOnePage
+	if err = json.Unmarshal(body, &camerasPerPage); err != nil {
+		fmt.Println("jsonErr:", err)
+		return camerasPerPage, false
+	}
+	if camerasPerPage.ErrCode != 0 {
+		fmt.Println("errcode: ", camerasPerPage.ErrCode, " errdesc: ", camerasPerPage.ErrDesc)
+		return camerasPerPage, false
+	}
+
+	if len(camerasPerPage.Data) > 0 {
+		for i, v := range camerasPerPage.Data {
+			if v.ResType == 2 {
+				fmt.Println("v.restype == 2")
+				camerasPerPage.Data = append(camerasPerPage.Data[:i], camerasPerPage.Data[i+1:]...)
+			}
+		}
+	}
+
+	return camerasPerPage, true
+}
+
+//GetAllCamerasByDevID 鑾峰彇鍏ㄩ儴涓嬬骇璁惧鐨勬憚鍍忔満鍒楄〃
+//devID  (瀛楃涓�)  娉ㄥ唽鐨勮澶囩殑20浣峣d
+func (api Gb28181Api) GetAllCamerasByDevID(devID string) ([]CameraInfo, bool) {
+	var cameraSlice []CameraInfo
+	camerasPerPage, flag := api.GetCamsByDevAndPage(devID, "all", 1)
+	if !flag {
+		fmt.Println("GetCamsByDevAndPage Error, deviceSlice is nil")
+		return cameraSlice, false
+	}
+	cameraSlice = camerasPerPage.Data
+
+	for i := 1; i < camerasPerPage.TotalPage; i++ {
+		camerasPerPage, flag := api.GetCamsByDevAndPage(devID, "all", i+1)
+		if !flag {
+			fmt.Println("GetCamsByDevAndPage Error! devID:" + devID + ",type:all,pageno:" + strconv.Itoa(i+1) + " ,cameraSlice is not completed")
+			return cameraSlice, false
+		}
+		cameraSlice = append(cameraSlice, camerasPerPage.Data...)
+	}
+
+	return cameraSlice, true
+}
+
+//SetCameraPtz 2.3 PTZ浜戝彴鎺у埗
+//"channelid":  (瀛楃涓�)   閫氶亾20浣嶇紪鍙�
+//"ptztype"锛�   (瀛楃涓�) 鎺у埗绫诲瀷锛氫笂"up",涓�"down",宸�"left",鍙�"right",宸︿笂"leftup",宸︿笅"leftdown",鍙充笂"rightup",鍙充笅"rightdown",闀滃ご杩�"zoomin",闀滃ご杩�"zoomout",
+//				鐒﹁窛杩�"focusfar",鐒﹁窛杩�"focusnear", 璁剧疆棰勭疆浣�"setpos",璋冮缃綅"callpos",鍋滄"stop"
+//"ptzparam":   (鏁板瓧)   鍙傛暟锛岄�熷害鑼冨洿涓�1-255
+func (api Gb28181Api) SetCameraPtz(chanID string, ptzType string, ptzParam int) bool {
+	url := BASIC_URL + "/vss/ptz/" + ptzType + "/" + strconv.Itoa(ptzParam) + "/" + chanID
+	client := NewClient()
+
+	body, err := client.DoGetRequest(url, nil, nil)
+	if err != nil {
+		fmt.Println("err:", err)
+		return false
+	}
+
+	//瑙f瀽 CamerasInOnePage
+	var res GbResult
+	if err = json.Unmarshal(body, &res); err != nil {
+		fmt.Println("jsonErr:", err)
+		return false
+	}
+	if res.ErrCode != 0 {
+		fmt.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
+		return false
+	}
+
+	return true
+}
diff --git a/httpClient.go b/httpClient.go
new file mode 100644
index 0000000..83d07c9
--- /dev/null
+++ b/httpClient.go
@@ -0,0 +1,155 @@
+package gb28181api
+
+import (
+	"bytes"
+	"encoding/json"
+	"io/ioutil"
+	"log"
+	"net/http"
+)
+
+type HttpClient struct{}
+
+//鍙戣捣GET璇锋眰
+func (httpApi HttpClient) DoGetRequest(url string, params map[string]string, headers map[string]string) ([]byte, error) {
+	var body []byte
+	request, err := http.NewRequest("GET", url, nil)
+	if err != nil {
+		return body, err
+	}
+	// add params
+	query := request.URL.Query()
+	if params != nil {
+		for key, val := range params {
+			query.Add(key, val)
+		}
+		request.URL.RawQuery = query.Encode()
+	}
+	//add headers
+	client := &http.Client{}
+	resp, err := client.Do(request)
+	if err != nil {
+		return body, err
+	}
+	defer resp.Body.Close()
+	body, err = ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return body, err
+	}
+	return body, nil
+}
+
+//鍙戣捣POST璇锋眰
+func (httpApi HttpClient) DoPostRequest(url string, contentType string, body map[string]interface{}, params map[string]string, headers map[string]string) ([]byte, error) {
+	var resultBytes []byte
+	var bodyJson []byte
+	if body != nil {
+		var err error
+		bodyJson, err = json.Marshal(body)
+		if err != nil {
+			return resultBytes, err
+		}
+	}
+	request, err := http.NewRequest("POST", url, bytes.NewBuffer(bodyJson))
+	if err != nil {
+		return resultBytes, err
+	}
+	request.Header.Set("Content-type", contentType)
+	//add params
+	q := request.URL.Query()
+	if params != nil {
+		for key, val := range params {
+			q.Add(key, val)
+		}
+		request.URL.RawQuery = q.Encode()
+	}
+	// add headers
+	if headers != nil {
+		for key, val := range headers {
+			request.Header.Add(key, val)
+		}
+	}
+	client := &http.Client{}
+	resp, err := client.Do(request)
+	if err != nil {
+		return resultBytes, err
+	}
+	defer resp.Body.Close()
+	resultBytes, err = ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return resultBytes, err
+	}
+	return resultBytes, nil
+}
+
+//鏋勯�爌ut璇锋眰
+func (httpApi HttpClient) DoPutRequest(url string, contentType string, body map[string]interface{}, headers map[string]string) ([]byte, error) {
+	var resultBytes []byte
+	var bodyJson []byte
+	if body != nil {
+		var err error
+		bodyJson, err = json.Marshal(body)
+		if err != nil {
+			return resultBytes, err
+		}
+	}
+	request, err := http.NewRequest("PUT", url, bytes.NewBuffer(bodyJson))
+	if err != nil {
+		log.Println(err)
+		return resultBytes, err
+	}
+	request.Header.Set("Content-type", contentType)
+	// add headers
+	if headers != nil {
+		for key, val := range headers {
+			request.Header.Add(key, val)
+		}
+	}
+	client := &http.Client{}
+	resp, err := client.Do(request)
+	if err != nil {
+		return resultBytes, err
+	}
+	defer resp.Body.Close()
+	resultBytes, err = ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return resultBytes, err
+	}
+	return resultBytes, nil
+}
+
+//鏋勯�燿elete璇锋眰
+func (httpApi HttpClient) DoDeleteRequest(url string, contentType string, body map[string]interface{}, headers map[string]string) ([]byte, error) {
+	var resultBytes []byte
+	var bodyJson []byte
+	if body != nil {
+		var err error
+		bodyJson, err = json.Marshal(body)
+		if err != nil {
+			return resultBytes, err
+		}
+	}
+	request, err := http.NewRequest("DELETE", url, bytes.NewBuffer(bodyJson))
+	if err != nil {
+		log.Println(err)
+		return resultBytes, err
+	}
+	request.Header.Set("Content-type", contentType)
+	// add headers
+	if headers != nil {
+		for key, val := range headers {
+			request.Header.Add(key, val)
+		}
+	}
+	client := &http.Client{}
+	resp, err := client.Do(request)
+	if err != nil {
+		return resultBytes, err
+	}
+	defer resp.Body.Close()
+	resultBytes, err = ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return resultBytes, err
+	}
+	return resultBytes, nil
+}

--
Gitblit v1.8.0