OSDN Git Service

update
[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 response struct {
17         Status    string          `json:"status"`
18         Data      json.RawMessage `json:"data"`
19         ErrDetail string          `json:"error_detail"`
20 }
21
22 func (s *Server) request(apiURL string, payload []byte, respData interface{}) error {
23         url := "http://" + s.IP + ":" + s.Port + "/" + apiURL
24         resp := new(response)
25         if err := post(url, payload, resp); err != nil {
26                 return err
27         }
28
29         if resp.Status != "success" {
30                 return errors.New(resp.ErrDetail)
31         }
32
33         return json.Unmarshal(resp.Data, respData)
34 }
35
36 func post(url string, payload []byte, result interface{}) error {
37         return PostWithHeader(url, nil, payload, result)
38 }
39
40 func PostWithHeader(url string, header map[string]string, payload []byte, result interface{}) error {
41         req, err := http.NewRequest("POST", url, bytes.NewBuffer(payload))
42         if err != nil {
43                 return err
44         }
45
46         // set Content-Type in advance, and overwrite Content-Type if provided
47         req.Header.Set("Content-Type", "application/json")
48         for k, v := range header {
49                 req.Header.Set(k, v)
50         }
51
52         client := &http.Client{}
53         resp, err := client.Do(req)
54         if err != nil {
55                 return err
56         }
57
58         defer resp.Body.Close()
59         if result == nil {
60                 return nil
61         }
62
63         body, err := ioutil.ReadAll(resp.Body)
64         if err != nil {
65                 return err
66         }
67
68         return json.Unmarshal(body, result)
69 }