无法使用 Invoke-RestMethod 更新工作项历史记录

Posted

技术标签:

【中文标题】无法使用 Invoke-RestMethod 更新工作项历史记录【英文标题】:Unable to update Work Item History using Invoke-RestMethod 【发布时间】:2020-09-26 13:51:55 【问题描述】:

我正在尝试从 PowerShell 向工作项历史记录添加一些信息。

发送例如json

[

    "path":  "/fields/System.History",
    "op":  "add",
    "value":  "Created by:\r\nRené Spišák\r\n\r\nTitle:\r\nPull request\r\n\r\nDescription:\r\nTest description"

]

到网址

https://XXX.visualstudio.com/XXX/_apis/wit/workitems/14611?api-version=5.1

使用

Invoke-RestMethod $workItemUrl -ContentType "application/json-patch+json" -Method "PATCH" -Headers $headers -Body $jsonBody

以错误结束

Invoke-RestMethod : "$id":"1","innerException":null,"message":"You must pass a valid patch document in the body of 
the request.","typeName":"Microsoft.VisualStudio.Services.Common.VssPropertyValidationException, 
Microsoft.VisualStudio.Services.Common","typeKey":"VssPropertyValidationException","errorCode":0,"eventId":3000
At C:\agent\_work\_temp\afb9aee6-21d2-4ea1-b455-916baee6d74b.ps1:127 char:29
+ ... mResponse = Invoke-RestMethod $workItemUrl -ContentType "application/ ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebExc 
   eption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

使用Postman 将相同的 json 发送到相同的 url 可以正常工作。

这个 api 有什么问题?什么是“有效补丁文件”?

如何将格式化的(新行、html 等)文本发送到工作项 api?https://docs.microsoft.com/en-us/rest/api/azure/devops/wit/work%20items/update?view=azure-devops-rest-5.1

编辑: 只是为了澄清 - 问题仅在 json 中的 value 字段中。脚本的其他部分工作正常。我可以使用Postman 将此 JSON 发布到 WIT Api。所有作品。但使用Invoke-RestMethod 失败。

那么也许 PowerShell 以不同的方式处理发送 Json?逃跑?字符集?

已解决:ContentType不正确,必须是"application/json-patch+json; charset=utf-8"

【问题讨论】:

显示你的脚本。 【参考方案1】:

powershell 似乎无法识别字符“René Spišák”,请尝试其他字符。

【讨论】:

刚刚找到,我不得不更改内容类型以包含字符集。 如果我的回复对您有帮助,您可以Accept it as an Answer,这对阅读此主题的其他社区成员会有所帮助。 这是某个地方的错误。请参阅tools.ietf.org/html/rfc8259#section-8 在不属于封闭生态系统的系统之间交换的 JSON 文本必须使用 UTF-8 编码。 charset=utf-8 用于 json 元素

以上是关于无法使用 Invoke-RestMethod 更新工作项历史记录的主要内容,如果未能解决你的问题,请参考以下文章

Invoke-RestMethod:发送到标头时找不到请求的身份验证数据

Invoke-RESTMethod PowerShell

powershell 使用REST-API的PowerShell V3 Multipart / formdata示例(Invoke-RestMethod)

powershell 使用REST-API的PowerShell V3 Multipart / formdata示例(Invoke-RestMethod)

PowerShell 的 Invoke-RestMethod 等效于 curl -u(基本身份验证)

用于排队构建的Invoke-RestMethod的Body需要包含什么? [重复]