Blame view
json.go
1.95 KB
8a81bda58 Moved Get/Post JS... |
1 |
package webutility |
765a887d9 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 Moved Get/Post JS... |
3 4 5 |
import ( "bytes" "encoding/json" |
765a887d9 io.EOF workaround |
6 |
"io" |
8a81bda58 Moved Get/Post JS... |
7 8 9 |
"net/http" "net/url" ) |
765a887d9 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 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 io.EOF workaround |
42 |
defer resp.Body.Close() |
8a81bda58 Moved Get/Post JS... |
43 |
status = resp.StatusCode |
32a277faa handle unsuccessf... |
44 45 46 |
if status != http.StatusOK { return status, err } |
765a887d9 io.EOF workaround |
47 48 49 50 51 |
if err = DecodeJSON(resp.Body, v); err == io.EOF { err = nil } return status, err |
8a81bda58 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 io.EOF workaround |
86 |
defer resp.Body.Close() |
32a277faa handle unsuccessf... |
87 88 89 |
if status != http.StatusOK && status != http.StatusCreated { return status, err } |
765a887d9 io.EOF workaround |
90 91 92 |
if err = DecodeJSON(resp.Body, v); err == io.EOF { err = nil } |
8a81bda58 Moved Get/Post JS... |
93 |
|
765a887d9 io.EOF workaround |
94 |
return status, err |
8a81bda58 Moved Get/Post JS... |
95 |
} |