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
|
}
|