首页 > 解决方案 > Powershell 在 URL 中为 RestMethod 编码 JSON 数组

问题描述

我正在使用 Knack 来解决业务流程问题,但是为了确保它成功,我需要运行一个日常脚本来同步 Knack 和我们的 HR 系统之间的数据。

Knack 使用 REST API,我想对 GET 调用应用过滤器,这样我就不必填充本地表来比较数据。

Knack 需要在 URL 中编码如下示例的 JSON 数组,以便过滤返回的结果。该示例显示了如何在 Javascript 中执行此操作,但我无法弄清楚如何在 Powershell 中执行此操作,任何人都可以提供帮助吗?

 // Request route
var api_url = 'https://api.knack.com/v1/objects/object_1/records';

// Prepare filters
var filters = {
  'match': 'or',
  'rules': [
             {
               'field':'field_1',
               'operator':'is',
               'value':'Dodgit'
             },
             {
               'field':'field_1',
               'operator':'is blank'
             }
           ]
};

// Add filters to route
api_url += '?filters=' + encodeURIComponent(JSON.stringify(filters));

标签: powershellrestapi

解决方案


您可以执行以下操作:

$api_url = 'https://api.knack.com/v1/objects/object_1/records'
$filters = @'
{
  'match': 'or',
  'rules': [
             {
               'field':'field_1',
               'operator':'is',
               'value':'Dodgit'
             },
             {
               'field':'field_1',
               'operator':'is blank'
             }
           ]
}
'@
$CompressedFilters = $filters | ConvertFrom-Json | ConvertTo-Json -Depth 10 -Compress
$encodedUri = "{0}?filters={1}" -f $api_url,[System.Web.HttpUtility]::UrlEncode($CompressedFilters)

解释:

$filters被定义为here-string$filters被管道传输到ConvertFrom-Json,然后到ConvertTo-Json,以便轻松压缩 JSON 数据。但是,这确实将单引号替换为双引号。

.NET 类中的UrlEncode()System.Web.HttpUtilityURL 中的特殊字符进行编码。

-f是字符串格式运算符。这有助于构建您的 URI 字符串。最终的 URI 存储在$encodedUri.

注意:使用小写十六进制字符对[System.Web.HttpUtility]::UrlEncode特殊字符进行编码。如果您的系统需要大写十六进制字符,请[System.Net.WebUtility]::UrlEncode改用。


推荐阅读