调试通过webservice接口
diff --git a/message.go b/message.go
index 725155d..2a78277 100644
--- a/message.go
+++ b/message.go
@@ -103,8 +103,8 @@
func (m *MessageWriter) Serialize() string {
m.Attributes["funcno"] = m.FuncNo
m.serialize_rowdata()
- m.Attributes["colnames"] = m.ColumnNames
- m.Attributes["coldescs"] = m.ColumnNames
+ m.Attributes["colname"] = m.ColumnNames
+ m.Attributes["coldesc"] = m.ColumnNames
m.Attributes["colcnt"] = len(m.ColumnNames)
r, _ := json.Marshal(m.Attributes)
return string(r)
@@ -191,8 +191,8 @@
m.DBMsg = convert_to_string(obj["dbmsg"])
m.ErrName = convert_to_string(obj["errname"])
- m.ColumnNames = get_column_names(obj["colnames"])
- m.ColumnDescs = get_column_names(obj["coldescs"])
+ m.ColumnNames = get_column_names(obj["colname"])
+ m.ColumnDescs = get_column_names(obj["coldesc"])
if rowdata, err := obj["rowdata"]; err {
if rowdata != nil {
@@ -207,16 +207,16 @@
}
}
reverseKey := map[string]bool{
- "funcno": true,
- "colnames": true,
- "coldescs": true,
- "rowcnt": true,
- "colcnt": true,
- "rowdata": true,
- "retcode": true,
- "retmsg": true,
- "dbmsg": true,
- "errname": true}
+ "funcno": true,
+ "colname": true,
+ "coldesc": true,
+ "rowcnt": true,
+ "colcnt": true,
+ "rowdata": true,
+ "retcode": true,
+ "retmsg": true,
+ "dbmsg": true,
+ "errname": true}
for k, v := range obj {
if _, ok := reverseKey[k]; ok {
diff --git a/webservice.go b/webservice.go
index 732f8be..067b172 100644
--- a/webservice.go
+++ b/webservice.go
@@ -13,6 +13,7 @@
"net"
"net/http"
"net/url"
+ "strconv"
"time"
)
@@ -31,6 +32,59 @@
session_key string
}
+func safe_get_json_int(value interface{}) int {
+ if value == nil {
+ return 0
+ }
+ s := fmt.Sprintf("%v", value)
+ if i, err := strconv.Atoi(s); err != nil {
+ return 0
+ } else {
+ return i
+ }
+}
+
+type ServiceResponse struct {
+ RetCode int
+ RetMsg string
+ Result map[string]interface{}
+}
+
+func NewServiceResponseFromJson(json_data interface{}) *ServiceResponse {
+ if json_data == nil {
+ return nil
+ }
+ res := &ServiceResponse{}
+ res.Result = json_data.(map[string]interface{})
+ res.RetCode = safe_get_json_int(res.Result["retcode"])
+ res.RetMsg = res.GetStrValue("retmsg")
+ return res
+}
+func (r *ServiceResponse) GetIntValue(name string) int {
+ return safe_get_json_int(r.Result[name])
+}
+
+func (r *ServiceResponse) GetStrValue(name string) string {
+ if s, ok := r.Result[name]; ok {
+ return fmt.Sprintf("%v", s)
+ } else {
+ return ""
+ }
+}
+
+func (r *ServiceResponse) GetFloatValue(name string) float64 {
+ if s, ok := r.Result[name]; ok {
+ t := fmt.Sprintf("%v", s)
+ if f, err := strconv.ParseFloat(t, 64); err != nil {
+ return 0.0
+ } else {
+ return f
+ }
+ } else {
+ return 0.0
+ }
+}
+
func (w *WebSession) DoGet(uri string, params map[string]string) (*http.Response, error) {
transport := http.Transport{Dial: dailTimeout}
@@ -46,6 +100,7 @@
}
}
full_url = full_url + "?" + vl.Encode()
+ // fmt.Printf("%v\n", full_url)
return client.Get(full_url)
}
@@ -55,18 +110,29 @@
t.Hour(), t.Minute(), t.Second())
}
-func (w *WebSession) Sign(message string) string {
- mac := hmac.New(sha1.New, []byte(w.Appsecret))
+func (w *WebSession) SignWithKey(key, message string) string {
+ mac := hmac.New(sha1.New, []byte(key))
mac.Write([]byte(message))
res := mac.Sum(nil)
return hex.EncodeToString(res)
}
+func (w *WebSession) Sign(message string) string {
+ return w.SignWithKey(w.Appsecret, message)
+}
+func (w *WebSession) NewClient(timeout int) *http.Client {
+ transport := http.Transport{Dial: func(network, addr string) (net.Conn, error) {
+ default_timeout := time.Duration(timeout) * time.Second
+ return net.DialTimeout(network, addr, default_timeout)
+ }}
+
+ return &http.Client{Transport: &transport}
+}
func (w *WebSession) DoPost(uri string, param map[string]string) (*http.Response, error) {
transport := http.Transport{Dial: dailTimeout}
client := &http.Client{Transport: &transport}
param["app_id"] = w.AppId
- param["term_id"] = w.TermId
+ // param["term_id"] = w.TermId
param["sign_method"] = "HMAC"
param["session_key"] = w.session_key
ts := w.GetTimestamp()
@@ -74,7 +140,7 @@
param["sign"] = w.Sign(w.AppId + w.TermId + w.session_key + ts)
full_url := w.BaseUrl + uri
- log.Debugf("Url=%v", full_url)
+ // log.Debugf("Url=%v", full_url)
data, err := json.Marshal(param)
if err != nil {
return nil, err
@@ -181,12 +247,73 @@
params["funcdata"] = call_data
r, err := w.DoPost("/ecardservice/ecardapi", params)
- if err != nil || r.StatusCode != 200 {
+ if err != nil {
log.Errorf(" err = %v\n", err)
return nil, err
}
+ if r.StatusCode != 200 {
+ return nil, errors.New(fmt.Sprintf("Request StatusCode:%v", r.StatusCode))
+ }
+
body, err := ioutil.ReadAll(r.Body)
r.Body.Close()
return NewMessageReader(body), nil
}
+
+func (w *WebSession) CallService(path string, params map[string]interface{},
+ sign_field []string, timeout int) (response *ServiceResponse, err error) {
+
+ return w.CallService2(path, params, timeout, sign_field...)
+}
+
+func (w *WebSession) CallService2(path string, params map[string]interface{}, timeout int,
+ sign_field ...string) (response *ServiceResponse, err error) {
+ client := w.NewClient(timeout)
+ err = nil
+ params["app_id"] = w.AppId
+ params["term_id"] = w.TermId
+ ts := w.GetTimestamp()
+ params["timestamp"] = ts
+
+ vl := &url.Values{}
+ for k, v := range params {
+ vl.Set(k, fmt.Sprintf("%v", v))
+ }
+
+ sign_data := ""
+ for _, k := range sign_field {
+ if v, ok := params[k]; ok {
+ sign_data += fmt.Sprintf("%v", v)
+ }
+ }
+ sign_data += ts + w.session_key
+ vl.Set("sign_method", "HMAC")
+ log.Debugf("Sign: key[%v] data[%v]\n", w.session_key, sign_data)
+ vl.Set("sign", w.SignWithKey(w.Appsecret, sign_data))
+
+ full_url := w.BaseUrl + path
+ log.Debugf("CallService: %v\n", full_url)
+ var r *http.Response
+ r, err = client.Post(full_url, "application/x-www-form-urlencoded",
+ bytes.NewReader([]byte(vl.Encode())))
+ if err != nil {
+ log.Errorf("Status=%v, err=%v", r, err)
+ return
+ }
+ if r.StatusCode != 200 {
+ log.Errorf("Request Error %v\n", r.StatusCode)
+ err = errors.New(fmt.Sprintf("Request Error, StatusCode : %v", r.StatusCode))
+ return
+ }
+ body, err := ioutil.ReadAll(r.Body)
+ r.Body.Close()
+ var s interface{}
+ err = json.Unmarshal(body, &s)
+ if err != nil {
+ log.Errorf("json unmarshal err %v", err)
+ return
+ }
+ response = NewServiceResponseFromJson(s)
+ return
+}