|
- package main
-
- import (
- "bytes"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "mime/multipart"
- "net/http"
- "net/http/httputil"
- "os"
- )
-
- //post a file to a url
- func postFileForm(filename string, targetURL string, formFieldName string) (strJSON string, err error) {
- bodyBuf := &bytes.Buffer{}
- bodyWriter := multipart.NewWriter(bodyBuf)
-
- // this step is very important
- fileWriter, err := bodyWriter.CreateFormFile(formFieldName, filename)
- if err != nil {
- fmt.Println(err)
- return "", err
- }
-
- // open file handle
- fh, err := os.Open(filename)
- if err != nil {
- fmt.Println(err)
- return "", err
- }
-
- //iocopy
- _, err = io.Copy(fileWriter, fh)
- if err != nil {
- return "", err
- }
-
- contentType := bodyWriter.FormDataContentType()
- bodyWriter.Close()
-
- resp, err := http.Post(targetURL, contentType, bodyBuf)
- if err != nil {
- return "", err
- }
- defer resp.Body.Close()
- r, err := ioutil.ReadAll(resp.Body)
- strJSON = string(r)
- if err != nil {
- return "", err
- }
- fmt.Println(resp.Status)
- fmt.Println(string(strJSON))
- return strJSON, nil
- }
-
- func postJSON(jsonB []byte, targetURL string) (resp string, err error) {
- headers := map[string]string{}
- headers["Content-Type"] = "application/json"
- return postRAW(jsonB, targetURL, headers)
- }
-
- func postRAW(data []byte, targetURL string, headers map[string]string) (resp string, err error) {
- return httpRaw("POST", targetURL, data, headers)
- }
-
- func putRAW(data []byte, targetURL string, headers map[string]string) (resp string, err error) {
- return httpRaw("PUT", targetURL, data, headers)
- }
-
- func httpRaw(httpMethod, targetURL string, data []byte, headers map[string]string) (resp string, err error) {
- requestBody := io.Reader(nil)
- if data != nil {
- requestBody = bytes.NewBuffer(data)
- }
- req, err := http.NewRequest(httpMethod, targetURL, requestBody)
- if err != nil {
- return
- }
-
- if headers != nil {
- for k, v := range headers {
- req.Header.Set(k, v)
- }
- }
-
- client := &http.Client{}
- r, err := client.Do(req)
- if err != nil {
- return
- }
- defer r.Body.Close()
-
- dump, err := httputil.DumpResponse(r, true)
- if err != nil {
- log.Fatal(err)
- }
- fmt.Printf("dump : %s", dump)
-
- b, _ := ioutil.ReadAll(r.Body)
- resp = string(b)
- log.Println(resp)
-
- return
-
- }
|