Blame view

json.go 1.95 KB
8a81bda58   Marko Tikvić   Moved Get/Post JS...
1
  package webutility
765a887d9   Marko Tikvić   io.EOF workaround
2
  // TODO(marko): If DecodeJSON() returns io.EOF treat it as if there is no response body, since response content length can sometimes be -1.
8a81bda58   Marko Tikvić   Moved Get/Post JS...
3
4
5
  import (
  	"bytes"
  	"encoding/json"
765a887d9   Marko Tikvić   io.EOF workaround
6
  	"io"
8a81bda58   Marko Tikvić   Moved Get/Post JS...
7
8
9
  	"net/http"
  	"net/url"
  )
765a887d9   Marko Tikvić   io.EOF workaround
10
11
12
13
14
  // DecodeJSON decodes JSON data from r to v.
  // Returns an error if it fails.
  func DecodeJSON(r io.Reader, v interface{}) error {
  	return json.NewDecoder(r).Decode(v)
  }
8a81bda58   Marko Tikvić   Moved Get/Post JS...
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  func GetJSON(url string, v interface{}, params url.Values, headers http.Header) (status int, err error) {
  	p := params.Encode()
  	if p != "" {
  		url += "?" + p
  	}
  
  	req, err := http.NewRequest(http.MethodGet, url, nil)
  	if err != nil {
  		return 0, err
  	}
  
  	if headers != nil {
  		for k, head := range headers {
  			for i, h := range head {
  				if i == 0 {
  					req.Header.Set(k, h)
  				} else {
  					req.Header.Add(k, h)
  				}
  			}
  		}
  	}
  
  	resp, err := http.DefaultClient.Do(req)
  	if err != nil {
  		return 0, err
  	}
765a887d9   Marko Tikvić   io.EOF workaround
42
  	defer resp.Body.Close()
8a81bda58   Marko Tikvić   Moved Get/Post JS...
43
  	status = resp.StatusCode
32a277faa   Marko Tikvić   handle unsuccessf...
44
45
46
  	if status != http.StatusOK {
  		return status, err
  	}
765a887d9   Marko Tikvić   io.EOF workaround
47
48
49
50
51
  	if err = DecodeJSON(resp.Body, v); err == io.EOF {
  		err = nil
  	}
  
  	return status, err
8a81bda58   Marko Tikvić   Moved Get/Post JS...
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  }
  
  func PostJSON(url string, v, r interface{}, params url.Values, headers http.Header) (status int, err error) {
  	buffer := bytes.NewBuffer(make([]byte, 0))
  	json.NewEncoder(buffer).Encode(v)
  
  	p := params.Encode()
  	if p != "" {
  		url += "?" + p
  	}
  
  	req, err := http.NewRequest(http.MethodPost, url, buffer)
  	if err != nil {
  		return 0, err
  	}
  
  	if headers != nil {
  		for k, head := range headers {
  			for i, h := range head {
  				if i == 0 {
  					req.Header.Set(k, h)
  				} else {
  					req.Header.Add(k, h)
  				}
  			}
  		}
  	}
  	req.Header.Set("Content-Type", "application/json")
  
  	resp, err := http.DefaultClient.Do(req)
  	if err != nil {
  		return 0, err
  	}
  	status = resp.StatusCode
765a887d9   Marko Tikvić   io.EOF workaround
86
  	defer resp.Body.Close()
32a277faa   Marko Tikvić   handle unsuccessf...
87
88
89
  	if status != http.StatusOK && status != http.StatusCreated {
  		return status, err
  	}
765a887d9   Marko Tikvić   io.EOF workaround
90
91
92
  	if err = DecodeJSON(resp.Body, v); err == io.EOF {
  		err = nil
  	}
8a81bda58   Marko Tikvić   Moved Get/Post JS...
93

765a887d9   Marko Tikvić   io.EOF workaround
94
  	return status, err
8a81bda58   Marko Tikvić   Moved Get/Post JS...
95
  }