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

我在用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 部分,缺少一些东西。


GCT1015
浏览 134回答 1
1回答

开心每一天1111

解决方案: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 ""}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go