【问题标题】:How use curl with spaces in json如何在json中使用带空格的curl
【发布时间】:2018-06-25 02:03:09
【问题描述】:

使用 curl 进行 POST 调用时,我无法正确传递 JSON 数据。字符串在第一个空格/空白处被截断。

我的调用看起来像这样,我正在通过一个具有两个参数的 powershell 脚本执行。使用这些参数,我连接了用于调用的 JSON。

我输入例如854e-ae7686fbc75a 365作为参数

# usage: powershell -file send.ps1 [apitoken] [interval]

param (
    [string]$apitoken = "",
    [int]$startInterval = "365"
)

$AUTHORIZATION = $apitoken
$STARTDATE = (Get-Date).AddDays(-$startInterval)
$ENDDATE = (Get-Date)
$JSON = '{\"ApiToken\":\"' + $AUTHORIZATION + '\",' +
    '\"StartDate\":\"' + $STARTDATE + '\",' +
    '\"EndDate\":\"' + $ENDDATE + '\",' +
    '\"Type\":\"SalesExport\"' +
    '}'

$CURLEXE = '..\bin\curl.exe'
$CurlArgument = '-X', 'POST',
                '-m', 7200,
                '-H', '"Content-Type:application/json"',
                '-d', $JSON,
                'https://my.server/export/sales'

& $CURLEXE @CurlArgument

STARTDATE 将是当前日期减去 365 天。 ENDDATE 将是当前日期。

问题在于,只要 JSON 变量中有空格(或者可能是任何空格),curl 就会认为 JSON 已结束并说 JSON 未终止。如果我用单引号或双引号括住变量,则没有区别。

即使空格在两个 DateTime 变量之一内,也会出现问题!

如何正确格式化 JSON 以使其包含空格?

【问题讨论】:

  • 我找到了一个部分解决方案,如果我确保 JSON 中没有空格并使用 (Get-Date).Date.ToString("yyyy-MM-dd") 代码有效。但如果我将来需要时间字符串,这也行不通。

标签: json powershell curl post


【解决方案1】:

不是直接回答您的问题,但既然您仍然使用 PowerShell:为什么不使用本机 Invoke-WebRequest 而不是外部命令?

$today   = (Get-Date).Date
$uri     = 'https://example.org/export/sales'
$headers = @{
    'Content-Type' = 'application/json'
}
$data    = @{
    'ApiToken'  = $apitoken
    'StartDate' = $today.AddDays(-$startInterval).ToString('d')
    'EndDate'   = $today.ToString('d')
    'Type'      = 'SalesExport'
} | ConvertTo-Json

Invoke-WebRequest -Method Post -Headers $headers -Body $data -Uri $uri

您也可以将 JSON 数据定义为多行字符串:

$startDate = $today.AddDays(-$startInterval).ToString('d')
$endDate   = $today.ToString('d')
$data = @"
{
    "ApiToken": "$apitoken",
    "StartDate": "$startDate",
    "EndDate": "$endDate",
    "Type": "SalesExport"
}
"@

【讨论】:

  • 我试过但收到以下错误消息:Invoke-WebRequest : "Invalid JSON primitive: Type."
  • 还是没有运气。 Invoke-WebRequest : "Invalid JSON primitive: Type." At line:33 char:1 + Invoke-WebRequest -Method Post -Headers $headers -Body $data -Uri $ur ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
  • 我的错。 $data 必须是 JSON 字符串,而不是哈希表。查看更新的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
相关资源
最近更新 更多