|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- package weapp
-
- import (
- "bytes"
- "crypto/tls"
- "encoding/json"
- "io"
- "log"
- "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 := httpClient().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 httpClient().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 := httpClient()
-
- resp, err := client.Do(req)
- if err != nil {
- return err
- }
- defer resp.Body.Close()
-
- return json.NewDecoder(resp.Body).Decode(response)
- }
-
- func httpClient() *http.Client {
- log.Print("myweapp use http")
- return &http.Client{
- Timeout: 10 * time.Second,
- Transport: &http.Transport{
- TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
- },
- }
- }
|