liuxiaolong
2020-06-08 0625c22f72e5fb2c5f60a59fae22ddd1982acb8d
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
package util
 
import (
    "bytes"
    "encoding/json"
    "fmt"
    "github.com/ajg/form"
    "io"
    "io/ioutil"
    "net/http"
    "os"
    "strings"
    "github.com/dustin/go-humanize"
)
 
const (
    DATA_URL_PREFIX      = "/data/api-v"
    CONTENT_TYPE_FORM    = "application/x-www-form-urlencoded"
    CONTENT_TYPE_MULFORM = "multipart/form-data"
    CONTENT_TYPE_JSON    = "application/json"
)
 
func DoPostRequest(url string, contentType string, body map[string]interface{}, params map[string]string, headers map[string]string) ([]byte, error) {
    var resultBytes []byte
    var request *http.Request
    var err error
    if contentType == CONTENT_TYPE_FORM || contentType == CONTENT_TYPE_MULFORM {
        formData, err := form.EncodeToString(body)
        if err != nil {
            return resultBytes, err
        }
        request, err = http.NewRequest("POST", url, strings.NewReader(formData))
        if err != nil {
            return resultBytes, err
        }
    } else {
        var bodyJson []byte
        if body != nil {
            var err error
            bodyJson, err = json.Marshal(body)
            if err != nil {
                return resultBytes, err
            }
        }
        request, err = http.NewRequest("POST", url, bytes.NewBuffer(bodyJson))
        if err != nil {
            return resultBytes, err
        }
    }
 
    request.Header.Set("Content-type", contentType)
    //add params
    q := request.URL.Query()
    if params != nil {
        for key, val := range params {
            q.Add(key, val)
        }
        request.URL.RawQuery = q.Encode()
    }
    // add headers
    if headers != nil {
        for key, val := range headers {
            request.Header.Add(key, val)
        }
    }
    client := &http.Client{}
    resp, err := client.Do(request)
    if err != nil {
        return resultBytes, err
    }
    defer resp.Body.Close()
    resultBytes, err = ioutil.ReadAll(resp.Body)
    if err != nil {
        return resultBytes, err
    }
    return resultBytes, nil
}
 
 
type WriteCounter struct {
    Total  uint64
}
 
func (wc WriteCounter) PrintProgress() {
    fmt.Printf("\r%s", strings.Repeat(" ", 35))
    fmt.Printf("/rDownloading... %s complete", humanize.Bytes(wc.Total))
}
 
func (wc *WriteCounter) Write(p []byte) (int, error) {
    n := len(p)
    wc.Total = uint64(n)
    wc.PrintProgress()
    return n, nil
}
 
//下载文件
func DownloadFile(fPath string, url string) error {
    f, err := os.Create(fPath)
    if err != nil {
        return err
    }
    resp, err := http.Get(url)
    if err != nil {
        f.Close()
        return err
    }
    defer resp.Body.Close()
    counter := &WriteCounter{}
    if _, err = io.Copy(f, io.TeeReader(resp.Body, counter)); err != nil {
        f.Close()
        return err
    }
    fmt.Printf("\n")
    f.Close()
    if err = os.Rename(fPath, fPath);err != nil {
        return err
    }
    return nil
}