github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/misc/form_data_request/form_data_request.go (about)

     1  /*
     2  do request for  formData with file
     3  */
     4  package form_data_request
     5  
     6  import (
     7  	"bytes"
     8  	"encoding/json"
     9  	"fmt"
    10  	"io"
    11  	"io/ioutil"
    12  	"mime/multipart"
    13  	"net/http"
    14  	"time"
    15  
    16  	"github.com/artisanhe/tools/courier/status_error"
    17  )
    18  
    19  func NewFileRequest(uri string, fileHeader *multipart.FileHeader) (*http.Request, error) {
    20  	fileContents, err := fileHeader.Open()
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  	defer fileContents.Close()
    25  
    26  	body := &bytes.Buffer{}
    27  	writer := multipart.NewWriter(body)
    28  	part, err := writer.CreatePart(fileHeader.Header)
    29  	if err != nil {
    30  		return nil, err
    31  	}
    32  	_, err = io.Copy(part, fileContents)
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  
    37  	err = writer.Close()
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  
    42  	req, err := http.NewRequest("POST", uri, body)
    43  	if err != nil {
    44  		return nil, err
    45  	}
    46  	req.Header.Set("Content-Type", writer.FormDataContentType())
    47  
    48  	return req, nil
    49  }
    50  
    51  func DoClient(req *http.Request, timeOut time.Duration, respResult interface{}) error {
    52  	client := &http.Client{
    53  		Timeout: timeOut,
    54  	}
    55  	resp, err := client.Do(req)
    56  	if err != nil {
    57  		return err
    58  	}
    59  	defer resp.Body.Close()
    60  
    61  	data, err := ioutil.ReadAll(resp.Body)
    62  
    63  	if err != nil {
    64  		return err
    65  	}
    66  
    67  	if resp.StatusCode/200 == 1 {
    68  		err := json.Unmarshal(data, respResult)
    69  		if err != nil {
    70  			msg := fmt.Sprintf("[%d] %s %s", resp.StatusCode, req.Method, req.URL)
    71  			return status_error.HttpRequestFailed.StatusError().WithDesc(msg)
    72  		}
    73  		return nil
    74  	} else {
    75  		statusError := &status_error.StatusError{}
    76  		err := json.Unmarshal(data, statusError)
    77  		if err != nil {
    78  			msg := fmt.Sprintf("[%d] %s %s", resp.StatusCode, req.Method, req.URL)
    79  			return status_error.HttpRequestFailed.StatusError().WithDesc(msg)
    80  		}
    81  		return nil
    82  	}
    83  }