Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

102 lines
2.0KB

  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "log"
  8. "mime/multipart"
  9. "net/http"
  10. "net/http/httputil"
  11. "os"
  12. )
  13. //post a file to a url
  14. func postFileForm(filename string, targetURL string, formFieldName string) (strJSON string, err error) {
  15. bodyBuf := &bytes.Buffer{}
  16. bodyWriter := multipart.NewWriter(bodyBuf)
  17. // this step is very important
  18. fileWriter, err := bodyWriter.CreateFormFile(formFieldName, filename)
  19. if err != nil {
  20. fmt.Println(err)
  21. return "", err
  22. }
  23. // open file handle
  24. fh, err := os.Open(filename)
  25. if err != nil {
  26. fmt.Println(err)
  27. return "", err
  28. }
  29. //iocopy
  30. _, err = io.Copy(fileWriter, fh)
  31. if err != nil {
  32. return "", err
  33. }
  34. contentType := bodyWriter.FormDataContentType()
  35. bodyWriter.Close()
  36. resp, err := http.Post(targetURL, contentType, bodyBuf)
  37. if err != nil {
  38. return "", err
  39. }
  40. defer resp.Body.Close()
  41. r, err := ioutil.ReadAll(resp.Body)
  42. strJSON = string(r)
  43. if err != nil {
  44. return "", err
  45. }
  46. fmt.Println(resp.Status)
  47. fmt.Println(string(strJSON))
  48. return strJSON, nil
  49. }
  50. func postJSON(jsonB []byte, targetURL string) (resp string, err error) {
  51. return postRAW(jsonB, targetURL, nil)
  52. }
  53. func postRAW(data []byte, targetURL string, headers map[string]string) (resp string, err error) {
  54. return httpRaw("POST", targetURL, data, headers)
  55. }
  56. func putRAW(data []byte, targetURL string, headers map[string]string) (resp string, err error) {
  57. return httpRaw("PUT", targetURL, data, headers)
  58. }
  59. func httpRaw(httpMethod, targetURL string, data []byte, headers map[string]string) (resp string, err error) {
  60. req, err := http.NewRequest(httpMethod, targetURL, bytes.NewBuffer(data))
  61. if err != nil {
  62. return
  63. }
  64. if headers != nil {
  65. for k, v := range headers {
  66. req.Header.Set(k, v)
  67. }
  68. }
  69. client := &http.Client{}
  70. r, err := client.Do(req)
  71. if err != nil {
  72. return
  73. }
  74. defer r.Body.Close()
  75. dump, err := httputil.DumpResponse(r, true)
  76. if err != nil {
  77. log.Fatal(err)
  78. }
  79. fmt.Printf("dump : %q", dump)
  80. b, _ := ioutil.ReadAll(r.Body)
  81. resp = string(b)
  82. log.Println(resp)
  83. return
  84. }