-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathapi.go
133 lines (112 loc) · 2.9 KB
/
api.go
1
2
3
4
5
6
7
8
9
10
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
51
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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
130
131
132
133
package pixela
import (
"bytes"
"encoding/json"
"io/ioutil"
"net/http"
"github.com/pkg/errors"
)
// APIBaseURL is Base URL for API requests.
const APIBaseURL = "https://pixe.la/v1"
const (
contentType = "Content-Type"
contentLength = "Content-Length"
userToken = "X-USER-TOKEN"
)
type requestParameter struct {
Method string
URL string
Header map[string]string
Body []byte
}
// Result is Pixela API Result struct.
type Result struct {
Message string `json:"message"`
IsSuccess bool `json:"isSuccess"`
}
func newHTTPRequest(param *requestParameter) (*http.Request, error) {
req, err := http.NewRequest(
param.Method,
param.URL,
bytes.NewReader(param.Body))
if err != nil {
return &http.Request{}, errors.Wrap(err, "failed to create http.Request")
}
if param.Header != nil {
for k, v := range param.Header {
req.Header.Add(k, v)
}
}
req.Header.Set(contentType, "application/json")
return req, nil
}
func doRequest(param *requestParameter) ([]byte, error) {
req, err := newHTTPRequest(param)
if err != nil {
return []byte{}, errors.Wrap(err, "failed to create http.Request")
}
client := http.Client{}
resp, err := client.Do(req)
if clientMock != nil {
resp, err = clientMock.do(req)
}
if err != nil {
return []byte{}, errors.Wrapf(err, "failed http.Client do")
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return []byte{}, errors.Wrapf(err, "failed to read response body")
}
return b, nil
}
func mustDoRequest(param *requestParameter) ([]byte, error) {
req, err := newHTTPRequest(param)
if err != nil {
return []byte{}, errors.Wrap(err, "failed to create http.Request")
}
client := http.Client{}
resp, err := client.Do(req)
if clientMock != nil {
resp, err = clientMock.do(req)
}
if err != nil {
return []byte{}, errors.Wrapf(err, "failed http.Client do")
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return []byte{}, errors.Wrapf(err, "failed to read response body")
}
if resp.StatusCode >= 300 {
return b, errors.Errorf("failed to call API: %s", string(b))
}
return b, nil
}
func doRequestAndParseResponse(param *requestParameter) (*Result, error) {
req, err := newHTTPRequest(param)
if err != nil {
return &Result{}, errors.Wrap(err, "failed to create http.Request")
}
client := http.Client{}
resp, err := client.Do(req)
if clientMock != nil {
resp, err = clientMock.do(req)
}
if err != nil {
return &Result{}, errors.Wrapf(err, "failed http.Client do")
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return &Result{}, errors.Wrapf(err, "failed to read response body")
}
return parseNormalResponse(b)
}
func parseNormalResponse(b []byte) (*Result, error) {
var result Result
if err := json.Unmarshal(b, &result); err != nil {
return &Result{}, errors.Wrapf(err, "failed to unmarshal json: "+string(b))
}
return &result, nil
}