package bhomedbapi
|
|
import (
|
"basic.com/valib/bhomebus.git"
|
"encoding/json"
|
"errors"
|
"fmt"
|
"strconv"
|
)
|
|
type SBusClient struct {
|
nodes []bhomebus.NetNode
|
}
|
|
type ProcInfo struct {
|
Name string `json:"name"` // 进程名称
|
ID string `json:"id"` // 进程唯一标识
|
Info string `json:"info"` // 进程的描述信息,用于区分同一进程名称下多个进程
|
}
|
|
type MsgInfo struct {
|
SrcProc ProcInfo `json:"srcProc"` // 源进程基本信息
|
MsgType string `json:"msgType"` // 数据类型,可为请求、发布、订阅、应答等
|
Topic string `json:"topic"` //请求主题
|
Body []byte `json:"body"` //请求内容或者反馈结果
|
}
|
|
type request struct {
|
Path string `json:"path"`
|
Method string `json:"method"`
|
ContentType string `json:"contentType"`
|
HeaderMap map[string][]string `json:"headerMap"`
|
QueryMap map[string][]string `json:"queryMap"`
|
FormMap map[string][]string `json:"formMap"`
|
PostFormMap map[string][]string `json:"postFormMap"`
|
Body []byte `json:"body"`
|
}
|
|
func (sc SBusClient) DoGetRequest(url string, params map[string]string, headers map[string]string) ([]byte, error) {
|
if sc.nodes == nil || len(sc.nodes) == 0 {
|
return nil, errors.New("invalid netNodes")
|
}
|
|
req := request {
|
Path: url,
|
Method: "GET",
|
ContentType: CONTENT_TYPE_JSON,
|
}
|
fillParam(&req, headers, params, nil)
|
|
return doReq(req, sc.nodes)
|
}
|
|
func (sc SBusClient) DoPostRequest(url string, contentType string, body map[string]interface{}, params map[string]string, headers map[string]string) ([]byte, error) {
|
if sc.nodes == nil || len(sc.nodes) == 0 {
|
return nil, errors.New("invalid port")
|
}
|
req := request {
|
Path: url,
|
Method: "POST",
|
ContentType: contentType,
|
}
|
fillParam(&req, headers, params, body)
|
if contentType == CONTENT_TYPE_FORM || contentType == CONTENT_TYPE_MULFORM {
|
if body != nil {
|
req.PostFormMap = make(map[string][]string)
|
for k,v := range body {
|
switch v.(type) {
|
case string:
|
req.FormMap[k] = []string{v.(string)}
|
req.PostFormMap[k] = []string{v.(string)}
|
case int:
|
req.FormMap[k] = []string{strconv.Itoa(v.(int))}
|
req.PostFormMap[k] = []string{strconv.Itoa(v.(int))}
|
case bool:
|
req.FormMap[k] = []string{strconv.FormatBool(v.(bool))}
|
req.PostFormMap[k] = []string{strconv.FormatBool(v.(bool))}
|
default:
|
logPrint("fill FORM or MultiForm,unknown value type,type is ", v)
|
}
|
|
}
|
}
|
} else if contentType == CONTENT_TYPE_JSON {
|
bs, err := json.Marshal(body)
|
if err != nil {
|
logPrint("fill json body err:", err)
|
} else {
|
req.Body = bs
|
}
|
}
|
|
return doReq(req, sc.nodes)
|
}
|
|
func (sc SBusClient) DoPutRequest(url string, contentType string, body map[string]interface{}, headers map[string]string) ([]byte, error) {
|
if sc.nodes == nil || len(sc.nodes) == 0 {
|
return nil, errors.New("invalid port")
|
}
|
req := request {
|
Path: url,
|
Method: "PUT",
|
ContentType: contentType,
|
}
|
fillParam(&req, headers, nil, body)
|
|
return doReq(req, sc.nodes)
|
}
|
|
func (sc SBusClient) DoDeleteRequest(url string, contentType string, body map[string]interface{}, headers map[string]string) ([]byte, error) {
|
if sc.nodes == nil || len(sc.nodes) == 0 {
|
return nil, errors.New("invalid port")
|
}
|
req := request {
|
Path: url,
|
Method: "DELETE",
|
ContentType: contentType,
|
}
|
fillParam(&req, headers, nil, body)
|
|
return doReq(req, sc.nodes)
|
}
|
|
func fillParam(req *request,headers map[string]string, params map[string]string, body map[string]interface{}) {
|
headerMap := make(map[string][]string)
|
queryMap := make(map[string][]string)
|
if headers != nil {
|
for k,v := range headers {
|
headerMap[k] = []string{v}
|
}
|
}
|
if params != nil {
|
for k,v := range params {
|
queryMap[k] = []string{v}
|
}
|
}
|
req.HeaderMap = headerMap
|
req.QueryMap = queryMap
|
b, err := json.Marshal(body)
|
if err != nil {
|
logPrint("marshal body err:", err)
|
} else {
|
req.Body = b
|
}
|
|
}
|
|
func doReq(req request, nodes []bhomebus.NetNode) ([]byte,error) {
|
rb, err := json.Marshal(req)
|
if err !=nil {
|
return nil,err
|
}
|
rMsg := MsgInfo{
|
Topic: req.Path,
|
Body: rb,
|
}
|
data, err := json.Marshal(rMsg)
|
if err != nil {
|
return nil, err
|
}
|
s := bhomebus.OpenSocket()
|
defer s.Close()
|
var ret []bhomebus.Mesg
|
if n := s.SendandrecvTimeout(nodes, data, &ret, 5000);n == 0 { //n==0表示没有请求成功
|
return nil, fmt.Errorf("doReq s.SendandrecvTimeout result n:%d", n)
|
} else {
|
logPrint("doReq SendandrecvTimeout n:", n)
|
if len(ret) > 0 {
|
var retMsg MsgInfo
|
err = json.Unmarshal(ret[0].Data, &retMsg)
|
if err != nil {
|
logPrint("doReq unmarshal to MsgInfo err:", err)
|
return nil, err
|
}
|
return retMsg.Body, nil
|
}
|
return nil, fmt.Errorf("no any response")
|
}
|
}
|