1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
package golang
import ( "bytes" "errors" "io" "mime/multipart" "net/http" "net/url" "os" )
type postRequest struct { client *http.Client req *http.Request resp http.Response }
type PostRequestInputConfig struct { Url string Proxy string Client *http.Client Body *PostRequestBodyField } type PostRequestBodyField struct { file map[string]string field map[string]string }
func NewPost(c *PostRequestInputConfig) (*postRequest, error) { var err error r := &postRequest{} if c.Url == "" { return nil, errors.New("url is not set") }
if c.Proxy != "" { r.client = &http.Client{Transport: &http.Transport{ Proxy: func(_ *http.Request) (*url.URL, error) { return url.Parse(c.Proxy) }, }} } if r.client == nil { r.client = &http.Client{} } if c.Client != nil { r.client = c.Client }
body := &bytes.Buffer{} bw := multipart.NewWriter(body)
for keyName, fp := range c.Body.file { fw, err := bw.CreateFormFile(keyName, fp) if err != nil { return nil, err } fd, err := os.Open(fp) if err != nil { return nil, err } _, err = io.Copy(fw, fd) fd.Close() }
for k, v := range c.Body.field { err := bw.WriteField(k, v) if err != nil { return nil, err } } _ = bw.Close()
r.req, err = http.NewRequest("POST", c.Url, body) if err != nil { return nil, err } r.req.Header.Set("Content-Type", bw.FormDataContentType()) return r, nil }
func (r *postRequest) SetHeader(name, value string) { r.req.Header.Set(name, value) }
func (r *postRequest) AddHeader(name, value string) { r.req.Header.Add(name, value) }
func (r *postRequest) Send() (*http.Response, error) { resp, err := r.client.Do(r.req) if err != nil { return nil, err } return resp, nil }
|