【问题标题】:Multipart request upload file and JSON message多部分请求上传文件和 JSON 消息
【发布时间】:2021-03-02 07:51:33
【问题描述】:

如何在go程序中实现curl请求

curl -XPOST -H 'Authorization: Bearer ***API*KEY***' http://127.0.0.1:9000/api/case/task/AVqqeXc9yQ6w1DNC8aDj/log -F '_json={"message": "Screenshot of fake site"};type=application/json' -F 'attachment=@screenshot1.png;type=image/png'

我尝试做类似的事情,但我的知识可能还不够

func CreateAttachedTask(caseid string, filename string, tasktitle string, taskdescription string, baseURL string, token string) {
fileDir, _ := os.Getwd()
    filePath := path.Join(fileDir, filename)

    file, err := os.Open(filePath)
    defer file.Close()
    buffer := new(bytes.Buffer)
    writer := multipart.NewWriter(buffer)
    part, _ := writer.CreateFormFile("filename", filepath.Base(file.Name()))
    io.Copy(part, file)
    writer.WriteField("_json", `{"message":"Screenshot of fake site"}`)
    defer writer.Close()
    req, err = http.NewRequest("POST", "http://127.0.0.1:9000/api/case/task/AVqqeXc9yQ6w1DNC8aDj/log", buffer)
    if err != nil {
        log.Fatal(err.Error())
    }
    req.Header.Set("Authorization", token)
    req.Header.Set("Content-Type", writer.FormDataContentType())

    client = &http.Client{Transport: defaultTtransportObs}
    resp, err = client.Do(req)
    if err != nil {
        panic(err)
    }
    fmt.Println("Log response Status:", resp.Status)
    defer resp.Body.Close()
}

【问题讨论】:

    标签: json go multipartform-data


    【解决方案1】:

    解决办法

    var b bytes.Buffer
    w := multipart.NewWriter(&b)
    file, err := os.Open(filename)
    
    req.Header.Set("Authorization", token)
    
    h := make(textproto.MIMEHeader) 
    h.Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="attachment"; filename="%s"`, filename))
    fileWriter, err := w.CreatePart(h)
    if err != nil {
        fmt.Println(err)
    }
    io.Copy(fileWriter, file)
    w.WriteField("_json", `{"message":"Attach:"}`)
    w.Close()
    
    req, err = http.NewRequest("POST", "http://127.0.0.1:9000/api/case/task/AVqqeXc9yQ6w1DNC8aDj/log", &b)
    if err != nil {
        log.Fatal(err.Error())
    }
    req.Header.Set("Content-Type", w.FormDataContentType())
    req.Header.Set("Authorization", token)
    
    res, err := client.Do(req)
    if err != nil {
        log.Fatal(err.Error())
    }
    
    if res.StatusCode != http.StatusOK {
        err = fmt.Errorf("bad status: %s", res.Status)
    }
    

    【讨论】:

      猜你喜欢
      • 2017-02-11
      • 2021-01-17
      • 2018-10-25
      • 2015-11-26
      • 1970-01-01
      • 2017-04-23
      • 2020-02-09
      • 2021-02-11
      • 2015-02-22
      相关资源
      最近更新 更多