具有urlencoded正文的http补丁请求

时间:2019-09-17 19:57:07

标签: http go dockerhub

我想通过提供的API将我的存储库更新到docker hub。我在Go中编写了一个小程序,该程序读取README.md文件的内容并将其内容设置为存储库的描述。

程序使用给定的parms的登录凭据查询JWT令牌。然后,将JWT令牌附加到补丁请求中进行身份验证。对于HTTP补丁请求,我得到状态码200,但是存储库的描述未更新。

以下是该功能的摘录:

data := url.Values{}
data.Set("full_description", repository.FullDescription)

req, err := http.NewRequest(http.MethodPatch, patchURL.String(), strings.NewReader(data.Encode()))
if err != nil {
  return nil, fmt.Errorf("Can not create request to update readme: %v", err)
}
req.Header.Add("Authorization", fmt.Sprintf("JWT %v", token.Token))
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

完整的功能在我的repository上提供。

经过一段时间的搜索,我发现了一个类似的项目,它通过curl发送请求。使用curl的--urlencode标志。没有此标志,说明将不会更新。

# Send a PATCH request to update the description of the repository
echo "Sending PATCH request"
REPO_URL="https://hub.docker.com/v2/repositories/${DOCKERHUB_REPOSITORY}/"
RESPONSE_CODE=$(curl -s --write-out %{response_code} --output /dev/null -H "Authorization: JWT ${TOKEN}" -X PATCH --data-urlencode full_description@${README_FILEPATH} ${REPO_URL})
echo "Received response code: $RESPONSE_CODE"

该项目的完整源代码托管在github

现在我问自己一个问题,如何编码请求的内容,以便补丁请求成功被API接受?

1 个答案:

答案 0 :(得分:1)

您提到的curl请求使用的是Patch请求,而您使用的是Post请求。尝试使用http.MethodPatch。