forked from royalrick/weapp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutil.go
138 lines (113 loc) · 2.95 KB
/
util.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
134
135
136
137
138
package weapp
import (
"bytes"
"encoding/json"
"io"
"math/rand"
"mime/multipart"
"net/http"
"net/url"
"os"
"time"
)
// tokenAPI 获取带 token 的 API 地址
func tokenAPI(api, token string) (string, error) {
queries := requestQueries{
"access_token": token,
}
return encodeURL(api, queries)
}
// encodeURL add and encode parameters.
func encodeURL(api string, params requestQueries) (string, error) {
url, err := url.Parse(api)
if err != nil {
return "", err
}
query := url.Query()
for k, v := range params {
query.Set(k, v)
}
url.RawQuery = query.Encode()
return url.String(), nil
}
// randomString random string generator
//
// ln length of return string
func randomString(ln int) string {
letters := []rune("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
b := make([]rune, ln)
r := rand.New(rand.NewSource(time.Now().UnixNano()))
for i := range b {
b[i] = letters[r.Intn(len(letters))]
}
return string(b)
}
// postJSON perform a HTTP/POST request with json body
func postJSON(url string, params interface{}, response interface{}) error {
resp, err := postJSONWithBody(url, params)
if err != nil {
return err
}
defer resp.Body.Close()
return json.NewDecoder(resp.Body).Decode(response)
}
func getJSON(url string, response interface{}) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
return json.NewDecoder(resp.Body).Decode(response)
}
// postJSONWithBody return with http body.
func postJSONWithBody(url string, params interface{}) (*http.Response, error) {
b := &bytes.Buffer{}
if params != nil {
enc := json.NewEncoder(b)
enc.SetEscapeHTML(false)
err := enc.Encode(params)
if err != nil {
return nil, err
}
}
return http.Post(url, "application/json; charset=utf-8", b)
}
func postFormByFile(url, field, filename string, response interface{}) error {
// Add your media file
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
return postForm(url, field, filename, file, response)
}
func postForm(url, field, filename string, reader io.Reader, response interface{}) error {
// Prepare a form that you will submit to that URL.
buf := new(bytes.Buffer)
w := multipart.NewWriter(buf)
fw, err := w.CreateFormFile(field, filename)
if err != nil {
return err
}
if _, err = io.Copy(fw, reader); err != nil {
return err
}
// Don't forget to close the multipart writer.
// If you don't close it, your request will be missing the terminating boundary.
w.Close()
// Now that you have a form, you can submit it to your handler.
req, err := http.NewRequest("POST", url, buf)
if err != nil {
return err
}
// Don't forget to set the content type, this will contain the boundary.
req.Header.Set("Content-Type", w.FormDataContentType())
// Submit the request
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
return json.NewDecoder(resp.Body).Decode(response)
}