【发布时间】:2022-01-24 12:31:28
【问题描述】:
我正在从 REST API 中获取 JSON 有效负载,我打算对其进行修改然后发回。我使用 ConvertFrom-Json 将有效负载转换为对象,使用 .Remove() 对其进行操作,然后使用 ConvertTo-Json 将其转换回 JSON。
当我将修改后的有效负载发送回 API 时,我收到“(400) 错误请求”。考虑到我在修改有效负载时搞砸了,我删除了那部分代码,但仍然出现相同的错误,即使我“只是”将未修改的有效负载从 JSON 转换为 JSON。
发回未修改的有效负载应导致“(422) UNPROCESSABLE ENTITY”,如果我将有效负载发回,甚至没有从 JSON 转换为 JSON,这就是我从 API 获得的响应。
据我所知,在这种情况下,-Depth 参数不是罪魁祸首(我添加了 -Depth 100 以确保)。我还在 ConvertFrom-Json 之前和 ConvertTo-Json 操作之后输出了有效负载,并且输出在屏幕上看起来相同。
如果我在修改和转换到 JSON 之后复制输出,然后将其作为正文粘贴到 Postman 调用中 - 其中所有其他参数与我的代码中的相同 - API 调用按预期工作。
检查服务器上的 API 日志仅包含此错误:“BadRequest: 400 Bad Request: Failed to decode JSON object: 'utf8' codec can't decode byte 0xf6 in position 2976: invalid start byte”
这让我觉得转换会改变字符串的编码,但我一生都无法弄清楚这怎么可能。
经过一天半的努力,我很高兴能得到有关此问题的所有反馈。 :)
编辑:这必须与 PowerShell 5.1 一起使用,因为这是我可以安全假设已安装的唯一版本。
谢谢。
【问题讨论】:
-
ConvertTo-Json -EscapeHandling EscapeNonAscii? -
在运行脚本时尝试在后台运行像 fiddler 这样的开发代理 - 您将能够看到 HTTP 请求的原始正文,以确认在线发送的字节是否正确与否……
-
@iRon 我意识到我忘了提到这必须与 PowerShell 5.1 一起工作,我很抱歉。我会更新帖子。
-
@mclayton 该脚本由远程 PSH 主机上的编排引擎 (Nutanix Calm) 执行,因此很遗憾我的调试选项有限。
-
我得到了一个提示,使用模拟 API 端点(Beeceptor)来查看在转换有效负载后我实际得到了什么,我发现 PSH 将字符格式更改为“真”UTF-8,在这种情况下它需要一个“ö”并将其更改为 \u00f6,这是我使用的 API 无法处理的。我认为这种行为是 PSH 转换的工作方式,但由于我不是此事的权威消息来源,我不想将其发布为我的问题的答案。
标签: json powershell api rest