Blame view
json.go
2.74 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" |
8c6dd0499 GetContent |
7 |
"io/ioutil" |
8a81bda58 Moved Get/Post JS... |
8 9 10 |
"net/http" "net/url" ) |
8c6dd0499 GetContent |
11 12 13 14 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 42 43 44 45 46 47 48 49 50 |
func GetContent(url string, params url.Values, headers http.Header) (content []byte, status int, err error) { if params != nil { p := params.Encode() if p != "" { url += "?" + p } } req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return nil, 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 nil, 0, err } defer resp.Body.Close() status = resp.StatusCode if status != http.StatusOK { return nil, status, err } content, err = ioutil.ReadAll(resp.Body) return content, status, err } |
765a887d9 io.EOF workaround |
51 52 53 54 55 |
// 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... |
56 |
func GetJSON(url string, v interface{}, params url.Values, headers http.Header) (status int, err error) { |
8c6dd0499 GetContent |
57 58 59 60 61 |
if params != nil { p := params.Encode() if p != "" { url += "?" + p } |
8a81bda58 Moved Get/Post JS... |
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
} 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 |
85 |
defer resp.Body.Close() |
8a81bda58 Moved Get/Post JS... |
86 |
status = resp.StatusCode |
32a277faa handle unsuccessf... |
87 88 89 |
if status != http.StatusOK { return status, err } |
765a887d9 io.EOF workaround |
90 91 92 93 94 |
if err = DecodeJSON(resp.Body, v); err == io.EOF { err = nil } return status, err |
8a81bda58 Moved Get/Post JS... |
95 96 97 98 99 |
} 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) |
8c6dd0499 GetContent |
100 101 102 103 104 |
if params != nil { p := params.Encode() if p != "" { url += "?" + p } |
8a81bda58 Moved Get/Post JS... |
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
} 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 |
130 |
defer resp.Body.Close() |
32a277faa handle unsuccessf... |
131 132 133 |
if status != http.StatusOK && status != http.StatusCreated { return status, err } |
765a887d9 io.EOF workaround |
134 135 136 |
if err = DecodeJSON(resp.Body, v); err == io.EOF { err = nil } |
8a81bda58 Moved Get/Post JS... |
137 |
|
765a887d9 io.EOF workaround |
138 |
return status, err |
8a81bda58 Moved Get/Post JS... |
139 |
} |