16 type response struct {
17 Status string `json:"status"`
18 Data json.RawMessage `json:"data"`
19 ErrDetail string `json:"error_detail"`
22 func (s *Server) request(apiURL string, payload []byte, respData interface{}) error {
23 url := "http://" + s.IP + ":" + s.Port + "/" + apiURL
25 if err := post(url, payload, resp); err != nil {
29 if resp.Status != "success" {
30 return errors.New(resp.ErrDetail)
33 return json.Unmarshal(resp.Data, respData)
36 func post(url string, payload []byte, result interface{}) error {
37 return PostWithHeader(url, nil, payload, result)
40 func PostWithHeader(url string, header map[string]string, payload []byte, result interface{}) error {
41 req, err := http.NewRequest("POST", url, bytes.NewBuffer(payload))
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 {
52 client := &http.Client{}
53 resp, err := client.Do(req)
58 defer resp.Body.Close()
63 body, err := ioutil.ReadAll(resp.Body)
68 return json.Unmarshal(body, result)