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