使用os/exec调用curl从GitLab私有仓库拉取文件返回404
问题原因
你遇到的404问题根源在URL的转义字符处理上:
- 在zsh终端里,
\?和\=是用来告诉shell不要把?和=当成shell元字符解析,shell会自动去掉反斜杠,把正确的raw?ref=master传给curl。 - 但Go的
exec.Command是直接将参数传递给curl,不会处理shell的转义字符,所以你的URL里的\?和\=会被curl当成URL的一部分,实际请求的是raw\?ref\=master,这显然不是GitLab API的正确路径,因此返回404。
修复代码
把URL里的反斜杠去掉,直接传递原始的URL参数即可:
func Test_curl(t *testing.T) { cmd := exec.Command( `curl`, `-H`, `PRIVATE-TOKEN:token`, `https://gitlab.some.com/api/v4/projects/23/repository/files/.gitignore/raw?ref=master`, ) t.Log(cmd.String()) var out bytes.Buffer cmd.Stdout = &out err := cmd.Run() if err != nil { t.Fatal(err) } t.Log(out.String()) }
验证逻辑
修改后,exec.Command传递给curl的URL是正确的raw?ref=master,和终端里shell处理后的参数完全一致,就能正常请求到GitLab仓库的文件内容了。
内容的提问来源于stack exchange,提问作者kozmo
相关产品推荐
相关产品推荐

