// Copyright (c) 2015 qianqiusoft.com // Licensed to You under the GNU Affero GPL v3 // See the LICENSE file at git.qianqiusoft.com/qianqiusoft/light-vocation/LICENSE // http://www.gnu.org/licenses/why-affero-gpl.en.html package utils import ( "bytes" "errors" "io" "io/ioutil" "mime/multipart" "net/http" "os" "strings" "crypto/tls" "time" ) type HttpUtil struct { } func NewHttpUtil() *HttpUtil { return &HttpUtil{} } // 使用body post提交数据 func (this *HttpUtil) PostBytes(url string, data []byte) ([]byte, error) { body := bytes.NewReader(data) request, err := http.NewRequest("POST", url, body) if err != nil { //log.Println("http.NewRequest,[err=%s][url=%s]", err, url) return []byte(""), err } request.Header.Set("Connection", "Keep-Alive") return this.getResponse(request) } // 模拟form提交数据,包含,上传文件 func (this *HttpUtil)PostFormWithReader(url string, params map[string]string, fileField, fileName string, r io.Reader) ([]byte, error) { body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile(fileField, fileName) if err != nil { return nil, err } _, err = io.Copy(part, r) for key, val := range params { _ = writer.WriteField(key, val) } err = writer.Close() if err != nil { return nil, err } request, err := http.NewRequest("POST", url, body) request.Header.Set("Content-Type", writer.FormDataContentType()) return this.getResponse(request) } // 模拟form提交数据,包含,上传文件 func (this *HttpUtil) PostFormWithFile(url string, params map[string]string, paramName, path string) ([]byte, error) { file, err := os.Open(path) if err != nil { return nil, err } defer file.Close() return this.PostFormWithReader(url, params, paramName, path, file) } // post func (this *HttpUtil) Post(url string, params map[string]string, headers map[string]string) ([]byte, error) { return this.doRequest("POST", url, params, headers) } // get func (this *HttpUtil) Get(url string, params map[string]string, headers map[string]string) ([]byte, error) { return this.doRequest("GET", url, params, headers) } // 一般数据提交 func (this *HttpUtil) doRequest(method string, url string, params map[string]string, headers map[string]string) ([]byte, error) { var r http.Request r.ParseForm() if params != nil { for k, v := range params { r.Form.Add(k, v) } } bodystr := strings.TrimSpace(r.Form.Encode()) request, err := http.NewRequest(method, url, strings.NewReader(bodystr)) if err != nil { return []byte(""), err } if headers == nil || len(headers) <= 0 { request.Header.Set("Content-Type", "application/x-www-form-urlencoded") request.Header.Set("Connection", "Keep-Alive") } else { for k, v := range headers { request.Header.Set(k, v) } } return this.getResponse(request) } func (this *HttpUtil) getResponse(request *http.Request) ([]byte, error) { if request == nil { return []byte(""), errors.New("request is nil") } tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, ResponseHeaderTimeout: time.Second * 60, DisableKeepAlives: true, } client := http.Client{Transport: tr} var resp *http.Response var err error resp, err = client.Do(request) if err != nil { //log.Println("http.Do failed,[err=%s][url=%s]", err, url) return []byte(""), err } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) if err != nil { return []byte(""), err } return b, err }