CloudServer.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package cloudserver
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "reflect"
  9. "time"
  10. "github.com/yuguorong/go/log"
  11. )
  12. type CloudServer struct {
  13. conf *CloudServerConf
  14. httpClient *http.Client
  15. Name string
  16. }
  17. func GetCloudServer(profile interface{}) *CloudServer {
  18. pfofileCS := profile.(*CloudServerConf)
  19. res := &CloudServer{conf: pfofileCS}
  20. res.httpClient = &http.Client{Timeout: 5 * time.Second}
  21. return res
  22. }
  23. func (c *CloudServer) GetClientData(infourl string, pData interface{}, param *map[string]string) error {
  24. pNum, psize := 1, 100
  25. reqParams := make(map[string]interface{})
  26. reqParams["pageSize"] = psize
  27. if param != nil {
  28. for k, v := range *param {
  29. reqParams[k] = v
  30. }
  31. }
  32. pin := reflect.ValueOf(pData).Elem()
  33. tin := reflect.TypeOf(pData).Elem()
  34. sliceret := reflect.MakeSlice(tin, 0, 0)
  35. itemCount := 0
  36. for {
  37. slicetmp := reflect.MakeSlice(tin, 0, 0)
  38. pin.Set(slicetmp)
  39. reqParams["pageNum"] = pNum
  40. p, e := c.requestPage(infourl, reqParams)
  41. pNum += 1
  42. if e != nil {
  43. log.Info("query ammeter error", e)
  44. break
  45. }
  46. if len(p.Rows) == 0 {
  47. break
  48. }
  49. e = p.ChangeData(pData)
  50. if e != nil {
  51. log.Info("change data error", e)
  52. continue
  53. }
  54. vin := reflect.ValueOf(pData).Elem()
  55. sliceret = reflect.AppendSlice(sliceret, vin)
  56. itemCount += vin.Len()
  57. if itemCount >= p.Total {
  58. vin.Set(sliceret)
  59. break
  60. }
  61. }
  62. return nil
  63. }
  64. func (c *CloudServer) requestPage(url string, data interface{}) (p *PageModel, erro error) {
  65. url = c.conf.ServerUrl + url
  66. httpClient := c.httpClient
  67. payload, erro := json.Marshal(data)
  68. if erro != nil {
  69. return
  70. }
  71. log.Info(url, "; paramter:", string(payload))
  72. reqBody := bytes.NewReader(payload)
  73. req, err := http.NewRequest("POST", url, reqBody)
  74. if err != nil {
  75. erro = err
  76. return
  77. }
  78. req.Header.Add("appId", c.conf.AppId)
  79. req.Header.Add("signature", c.conf.GenerateSignature())
  80. req.Header.Add("Content-Type", "application/json")
  81. resp, err := httpClient.Do(req)
  82. if err != nil {
  83. erro = err
  84. return
  85. }
  86. defer resp.Body.Close()
  87. if resp.StatusCode != 200 {
  88. erro = fmt.Errorf("respose statuscode is not equal 200")
  89. return
  90. }
  91. body, err := ioutil.ReadAll(resp.Body)
  92. if err != nil {
  93. erro = err
  94. return
  95. }
  96. var jbody CommonResp
  97. err = json.Unmarshal(body, &jbody)
  98. if err != nil {
  99. erro = err
  100. return
  101. }
  102. if jbody.Code != 0 {
  103. erro = fmt.Errorf("response error %s", jbody.Msg)
  104. return
  105. }
  106. pageModel := &PageModel{}
  107. erro = jbody.ChangeData(pageModel)
  108. p = pageModel
  109. return
  110. }