OSDN Git Service

add docs
[bytom/shuttle.git] / swap / request.go
1 package swap
2
3 import (
4         "bytes"
5         "encoding/json"
6         "errors"
7         "io/ioutil"
8         "net/http"
9 )
10
11 type Server struct {
12         IP   string
13         Port string
14 }
15
16 type Result struct {
17         Data json.RawMessage `json:"data"`
18 }
19
20 type response struct {
21         Code int    `json:"code"`
22         Msg  string `json:"msg"`
23         Res  Result `json:"result,omitempty"`
24 }
25
26 func (s *Server) request(apiURL string, payload []byte, respData interface{}) error {
27         url := "http://" + s.IP + ":" + s.Port + "/" + apiURL
28         resp := new(response)
29         if err := post(url, payload, resp); err != nil {
30                 return err
31         }
32
33         if resp.Code != 200 {
34                 return errors.New(resp.Msg)
35         }
36
37         return json.Unmarshal(resp.Res.Data, respData)
38 }
39
40 func post(url string, payload []byte, result interface{}) error {
41         return PostWithHeader(url, nil, payload, result)
42 }
43
44 func PostWithHeader(url string, header map[string]string, payload []byte, result interface{}) error {
45         req, err := http.NewRequest("POST", url, bytes.NewBuffer(payload))
46         if err != nil {
47                 return err
48         }
49
50         // set Content-Type in advance, and overwrite Content-Type if provided
51         req.Header.Set("Content-Type", "application/json")
52         for k, v := range header {
53                 req.Header.Set(k, v)
54         }
55
56         client := &http.Client{}
57         resp, err := client.Do(req)
58         if err != nil {
59                 return err
60         }
61
62         defer resp.Body.Close()
63         if result == nil {
64                 return nil
65         }
66
67         body, err := ioutil.ReadAll(resp.Body)
68         if err != nil {
69                 return err
70         }
71
72         return json.Unmarshal(body, result)
73 }