package util import ( "bytes" "encoding/json" "fmt" "io" "io/ioutil" "net/http" "os" "strings" "time" "github.com/ajg/form" "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 DoGetRequest(url string, params map[string]string, headers map[string]string) ([]byte, error) { var body []byte request, err := http.NewRequest("GET", url, nil) if err != nil { return body, err } // add params query := request.URL.Query() if params != nil { for key, val := range params { query.Add(key, val) } request.URL.RawQuery = query.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 body, err } defer resp.Body.Close() body, err = ioutil.ReadAll(resp.Body) if err != nil { return body, err } return body, nil } func DoPostRequest(url string, contentType string, body map[string]interface{}, params map[string]string, headers map[string]string, timeOut time.Duration) ([]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{ Timeout: timeOut, } 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 }