我正在使用面向Gitlab的REST API,目前,我们需要使用API更新一个子模块,在curl中,过程应如下所示:

curl --request PUT -v --header "PRIVATE-TOKEN: XXXXXXXXXX" "http://mygitlab.com/api/v4/projects/1/repository/submodules/MYSUBMODULE" \
  --data "branch=master&commit_sha=6bf09c4a3dc4ca79cbe301e6add06005f38ad9e3&commit_message=Update submodule reference"

使用curl可以正常工作,但是我们需要使用PowerShell来执行此操作,我们正在尝试使用Invoke-RestMethod for Powershell 5.1,并且根据文档,它应该是这样的:
Invoke-RestMethod -Headers @{"PRIVATE-TOKEN"="$TOKEN"} -Method Put -Uri "http://mygitlab.com/api/v4/projects/1/repository/submodules/MYSUBMODULE" -Body "branch=master&commit_sha=6bf09c4a3dc4ca79cbe301e6add06005f38ad9e3&commit_message=Update submodule reference"

但是我们的结果如下:

Invoke-RestMethod:{“错误”:“commit_sha丢失,分支丢失”}
在C:\ version-manager \ release.ps1:67 char:1
+ Invoke-RestMethod- header @ {“PRIVATE-TOKEN” =“$ TOKEN”}-方法放入-U ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo:InvalidOperation:(System.Net.HttpWebRequest:HttpWebRequest)[Invoke-RestMethod],WebException
+ FullyQualifiedErrorId:WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

请注意,就像没有得到主体一样,据我所知,PowerShell中curl中的--data应该是-Body

任何想法如何解决这个问题?

最佳答案

经过一番研究,我什至在documentation中说:



在调用中将内容类型指定为“application / x-www-form-urlencoded”(如果未指定,则应将其作为默认值)后,该调用即可工作。

最终解决方案是:

Invoke-RestMethod -Headers @{"PRIVATE-TOKEN"="$TOKEN"} -Method Put -Uri "http://mygitlab.com/api/v4/projects/1/repository/submodules/MYSUBMODULE" -Body "branch=master&commit_sha=6bf09c4a3dc4ca79cbe301e6add06005f38ad9e3&commit_message=Update submodule reference" -ContentType "application/x-www-form-urlencoded"

我希望这对将来的人有所帮助。

08-27 07:48