具有urlencoded正文的http补丁请求

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

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

以下是该函数的摘录:</ p>

< pre class =“ lang-golang prettyprint-override”> data:= url.Values {}
data.Set(“ full_description”,repository.FullDescription)

req,err:= http.NewRequest(http。 MethodPatch,patchURL.String(),strings.NewReader(data.Encode()))
if err!= nil {
返回nil,fmt.Errorf(“无法创建更新自述文件的请求:%v”,err)

}
req.Header.Add(“授权”,fmt.Sprintf(“ JWT%v”,token.Token))
req.Header.Add(“ Content-Type”,“ application / x-www-form -urlencoded“)
</ code> </ pre>

完整的功能在我的存储库。</ p>

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

 <代码>#发送PATCH请求以更新存储库的描述
echo“发送PATCH请求”
REPO_URL =“ https:/ /hub.docker.com/v2/repositories/${DOCKERHUB_REPOSITORY}/"
RESPONSE_CODE=$(curl -s --write-out%{response_code} --output / dev / null -H“授权:JWT $ {TOKEN }“ -X PATCH --data-urlencode full_description @ $ {README_FILEPATH} $ {REPO_URL})
echo”收到的响应代码:$ RESPONSE_CODE“
</ code> </ pre>

完整 该项目的源代码托管在 github < / p>

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

展开原文

原文

I would like to update my repository to docker hub via the provided API. I wrote a small program in Go that reads the content of a README.md file and sets the content as a description of the repository.

The program queries a JWT token using the login credentials of the given parms. The JWT token is then attached to the patch request for authentication. For the HTTP patch request I get the status code 200, but the description of the repository is not updated.

Here is an excerpt of the function:

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")

The complete function is provided on my repository.

After some time of searching I found a similar project that sends the request via curl. The flag --urlencode of curl is used. Without this flag the description will not be updated.

# 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"

The complete source code of the project is hosted on github

Now I ask myself the question, how do I encode the content of the request so that the patch request is successfully accepted by the API?

1个回答



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

展开原文

原文

The curl request you mentioned is using a Patch request, you're using a Post request. Try http.MethodPatch instead.

duanqiao2006
duanqiao2006 似乎默认传输添加了它。 您可能要尝试将具有DisableCompression的Transport设置为true的客户端尝试请求。
9 个月之前 回复
dqwh1205
dqwh1205 好像是内容编码。 但是,我不知道如何删除golang自动添加的编码-diff:diffchecker.com/XcRRgtnM
9 个月之前 回复
drui0508
drui0508 如果要对此进行故障排除,我将打印请求,弄清楚curl是如何写入请求的(curl -v帮助吗?),然后尝试查看是否存在不匹配。
10 个月之前 回复
doulu4316
doulu4316 我设置了Content-Length,但是它仍然是相同的行为。 git.cryptic.systems/volker.raschek/dhd/src/branch/master/pkg/...
10 个月之前 回复
dsvjmc0907
dsvjmc0907 您也可以尝试设置为Content-Length。
10 个月之前 回复
dongshen3352
dongshen3352 抱歉,由于所有测试,我忘了将该方法放回补丁中。 同一期
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问