为啥在此 cURL 调用中的请求正文中出现格式错误的 JSON?

Posted

技术标签:

【中文标题】为啥在此 cURL 调用中的请求正文中出现格式错误的 JSON?【英文标题】:Why do I get a malformed JSON in request body in this cURL call?为什么在此 cURL 调用中的请求正文中出现格式错误的 JSON? 【发布时间】:2016-10-14 20:04:57 【问题描述】:

我一直在尝试调用 CloudFlare API v4,使用他们自己的文档中提供的示例。

这是示例代码

curl -X PUT "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/372e67954025e0ba6aaa6d586b9e0b59" \ -H "X-Auth-Email: user@example.com" \ -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \ -H "Content-Type: application/json" \ --data '"id":"372e67954025e0ba6aaa6d586b9e0b59","type":"A","name":"example.com","content":"1.2.3.4","proxiable":true,"proxied":false,"ttl":120,"locked":false,"zone_id":"023e105f4ecef8ad9ca31a8372d0c353","zone_name":"example.com","created_on":"2014-01-01T05:20:00.12345Z","modified_on":"2014-01-01T05:20:00.12345Z","data":'

也可以在 Update DNS Records

使用 Windows cmd.exe 运行此命令,我需要先将其设为单行,因此我删除了“”并重新格式化(两次)以确保我没有更改过程中的任何部分。

这是同一行代码:

curl -X PUT "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/372e67954025e0ba6aaa6d586b9e0b59" -H "X-Auth-Email: user@example.com" -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" -H "Content-Type: application/json" --data '"id":"372e67954025e0ba6aaa6d586b9e0b59","type":"A","name":"example.com","content":"1.2.3.4","proxiable":true,"proxied":false,"ttl":120,"locked":false,"zone_id":"023e105f4ecef8ad9ca31a8372d0c353","zone_name":"example.com","created_on":"2014-01-01T05:20:00.12345Z","modified_on":"2014-01-01T05:20:00.12345Z","data":'

当我在 cmd 中运行这个单行程序时,它可以工作,但是我在请求正文中得到一个格式错误的 JSON,但是,目视检查、Notepad++ 上的格式和通过 JSON 验证器的运行都是积极的,这个 JSON(复制自CloudFlare 文档)没有格式错误。

错误信息

"success":false,"errors":["code":6007,"message":"请求正文中的 JSON 格式错误"],"messages":[],"result":null

谷歌搜索这条错误消息或错误代码没有给我任何信息,同样的命令适用于运行 Linux 的 PC。

谁能告诉我这是否是一个已知的错误、JSON 是否真的格式错误或是否有其他想法?

【问题讨论】:

【参考方案1】:

我在博文中找到了答案:"Expecting to find valid JSON in request body..." curl for Windows。

例如,Purge everything --data 的值将是:

# On Linux
--data '"purge_everything":true'

# On Windows
--data "\"purge_everything\":true"

对于 Windows:

    用双引号代替单引号:'-->" 用反斜杠转义双引号:" --> \"

【讨论】:

【参考方案2】:

cmd.exe 不支持单引号,要直接从您可以使用 Bash 的文档中运行这些命令。

Bash 可以在 Windows 10 中启用:https://www.laptopmag.com/uk/articles/use-bash-shell-windows-10

或者 Git Bash 自带 Git for windows:https://gitforwindows.org/

【讨论】:

以上是关于为啥在此 cURL 调用中的请求正文中出现格式错误的 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

cURL 版本 7.64 上的 curl_multi 出现“无法解析主机”错误

API 请求中的单引号正文

如何通过 Windows 批处理脚本中的 curl 发送带有 json 正文的 POST 请求

来自具有特定“接受”标头的请求的错误响应正文格式

Jenkinsfile/Groovy:为啥 curl 命令会导致“错误请求”

为啥我的 Discord.js 欢迎消息中出现“无效的表单正文”错误?