[英]Multipart request upload file and JSON message
How to implement a curl request in a go program如何在 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'
I tried to do something similar, but my knowledge is probably not enough我试图做类似的事情,但我的知识可能还不够
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()
}
Here is the solution这是解决方案
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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.