为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 golang 中为 youtrack rest api 编写这样的 curl 请求?

如何在 golang 中为 youtrack rest api 编写这样的 curl 请求?

Go
GCT1015 2023-01-03 14:01:37
我在用youtrack REST 写golang 客户端我写过最多的API 路径。但是在将文件附加到 Issue 时遇到了问题。所以,这里有一个小而好的文档https://www.jetbrains.com/help/youtrack/devportal/api-usecase-attach-files.html使用此文档页面和其他文档页面中的命令与 curl(通过终端)一起使用 我是 golang 的新手,但必须用这种语言编写。func createForm(form map[string]string) (string, io.Reader, error) {    body := new(bytes.Buffer)    mp := multipart.NewWriter(body)    defer mp.Close()    for key, val := range form {        if strings.HasPrefix(val, "@") {            val = val[1:]            file, err := os.Open(val)            if err != nil {                return "", nil, err            }            defer file.Close()            part, err := mp.CreateFormFile(key, val)            if err != nil {                return "", nil, err            }            io.Copy(part, file)        } else {            mp.WriteField(key, val)        }    }    return mp.FormDataContentType(), body, nil}func AttachFileToIssue(path string, issueID string) {    form := map[string]string{"image": "@image.jpeg", "key": "KEY"}    _, body, err := createForm(form)    if err != nil {        panic(err)    }    req, err := http.NewRequest("POST", youTrackUrl+"/api/issues/"+issueID+"/attachments?fields=id,name", body)    if err != nil {        // handle err    }    req.Header.Set("Authorization", "Bearer "+youTrackToken)    req.Header.Set("Content-Type", "multipart/form-data")    resp, err := http.DefaultClient.Do(req)    if err != nil {        // handle err    }    fmt.Println(resp)    if resp.StatusCode == http.StatusOK {        bodyBytes, err := io.ReadAll(resp.Body)        if err != nil {            log.Fatal(err)        }        bodyString := string(bodyBytes)        fmt.Println(bodyString)    }    defer func(Body io.ReadCloser) {        err := Body.Close()        if err != nil {        }    }(resp.Body)}我用 wireshark 检查出了什么问题,问题出在 mime 部分,缺少一些东西。
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

解决方案:


func createForm(form map[string]string) (string, io.Reader, error) {

    body := new(bytes.Buffer)

    mp := multipart.NewWriter(body)

    defer func(mp *multipart.Writer) {

        err := mp.Close()

        if err != nil {


        }

    }(mp)

    var file *os.File

    for key, val := range form {

        if strings.HasPrefix(val, "@") {

            val = val[1:]

            file, err := os.Open(val)

            if err != nil {

                return "", nil, err

            }

            part, err := mp.CreateFormFile(key, val)

            if err != nil {

                return "", nil, err

            }

            _, err = io.Copy(part, file)

            if err != nil {

                return "", nil, err

            }

        } else {

            err := mp.WriteField(key, val)

            if err != nil {

                return "", nil, err

            }

        }

    }

    defer func(file *os.File) {

        err := file.Close()

        if err != nil {


        }

    }(file)


    return mp.FormDataContentType(), body, nil

}


func AttachFileToIssue(path string, issueID string) string {

    form := map[string]string{"path": "@" + path}

    mp, body, err := createForm(form)

    if err != nil {

        panic(err)

    }

    req, err := http.NewRequest("POST", youTrackUrl+"/api/issues/"+issueID+"/attachments?fields=id,name", body)


    if err != nil {

        // handle err

    }


    req.Header.Set("Authorization", "Bearer "+youTrackToken)

    req.Header.Set("Content-Type", mp)


    resp, err := http.DefaultClient.Do(req)

    if err != nil {

        // handle err

    }

    if resp.StatusCode == http.StatusOK {

        bodyBytes, err := io.ReadAll(resp.Body)

        if err != nil {

            log.Fatal(err)

        }

        bodyString := string(bodyBytes)

        return bodyString

    }

    defer func(Body io.ReadCloser) {

        err := Body.Close()

        if err != nil {


        }

    }(resp.Body)

    return ""

}



查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信