POSTMAN - 在后续 POST 请求之前将 GET 请求的响应修改为 JSON 格式 - 几乎完成 - 请参阅编辑

POSTMAN - Modifying response for GET request to JSON format prior to subsequent POST request - ALMOST COMPLETED - SEE EDIT

提问人:protonarc 提问时间:11/4/2023 最后编辑:protonarc 更新时间:11/6/2023 访问量:64

问:

快速摘要:想要发出一个 GET 请求,其中响应正文转换为标准 JSON 格式,以便我可以在设置环境变量时指向这些非常 JSON 对象,这些环境变量将在随后的 POST 中引用。

详细背景:处理各种集合,这些集合从 Excel 工作表中循环访问无线接入点 (AP) 列表。此特定集合对 excel 列表中的每个 AP 都有一个 GET 和一个后续 POST:其目的是向 ARUBA CENTRAL API 发送 GET 请求,以根据 excel 中的 SERIAL# 值获取特定 AP 的配置(10 个属性)。然后,要发回具有 11 个属性的 POST 请求以重新配置 AP:

  1. 七个属性保持不变,因此从初始 GET 响应体引用
  2. 两个属性正在更改,它们的值取自 excel 工作表(简单)
  3. 两个属性是静态的(简单)

然后,它转到 excel 中的下一个序列号 #,用于下一组获取/发布请求,依此类推。

问题摘要:只有 POST 的 #1 有问题:我一直在使用这种方法对 ARUBA CENTRAL 的许多不同 API 调用,并取得了很大的成功。但是,在这种情况下,特定的 API 调用返回的响应正文不是我习惯处理的典型 JSON 格式,如下所示:

获取:

{{base_url}}/configuration/v1/ap_settings_cli/{{SERIAL}}

->这会向 Aruba Central 的 API 发送一个 GET,其中包含从 excel 工作表中获取的 SERIAL 值。

响应正文

[
  "per-ap-settings ab:xz:1x:5y:3c:65",
  "  hostname room-1-ap",
  "  ip-address 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 \"\"",
  "  wifi0-mode access",
  "  wifi1-mode access",
  "  g-channel 0 -127",
  "  a-channel 0 -127",
  "  a-external-antenna 0",
  "  g-external-antenna 0",
  "  zonename _#ALL#_"
]

-> 响应标头 -> Content-Type: application/json ,但这不是我习惯处理的典型 JSON 格式。需要它采用典型的 JSON 格式,以便 TESTS 部分正常工作

我的想法是将响应正文修改为以下标准JSON格式:

建议对响应正文进行修改

{
  "per-ap-settings": "ab:xz:1x:5y:3c:65",
  "hostname": "room-1-ap",
  "ip-address": "0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 \"\"",
  "wifi0-mode": "access",
  "wifi1-mode": "access",
  "g-channel": "0 -127",
  "a-channel": "0 -127",
  "a-external-antenna": "0",
  "g-external-antenna": "0",
  "zonename": "_#ALL#_"
}

如果我能以这种格式获得它们,我相信以下代码行将起作用:

当前测试(在 GET REQUEST 下)

pm.environment.set("per-ap-settings", pm.response.json().per-ap-settings);
pm.environment.set("hostname", pm.response.json.hostname);
pm.environment.set("ip-address", pm.response.json().ip-address);
pm.environment.set("wifi0-mode", pm.response.json().wifi0-mode);
pm.environment.set("wifi1-mode", pm.response.json().wifi1-mode);
pm.environment.set("g-channel", pm.response.json().g-channel);
pm.environment.set("a-channel", pm.response.json().a-channel);

以下是后续的 POST,它失败了,因为没有设置环境变量(来自 GET),并且没有设置它们,因为我的 responsebody 不是典型的 JSON 格式。

请注意引用的 7 个环境变量。另请注意,AGAIN 和 GGAIN 是从 Excel 工作表的 AGAIN 和 GGAIN 标头下的值中检索的变量。最后,请注意 zoneA 和 newsite 是静态值。重申一下,POST 的唯一问题是没有设置 7 个环境变量的值,而是显示为 NULL:

POST REQUEST(引用上一个 GET 中的环境变量)

{
  "clis": [
  "per-ap-settings {{per-ap-settings}}",
  "  hostname {{hostname}}",
  "  ip-address {{ip-address}}",
  "  wifi0-mode {{wifi0-mode}}",
  "  wifi1-mode {{wifi1-mode}}",
  "  g-channel {{g-channel}}",
  "  a-channel {{a-channel}}",
  "  a-external-antenna {{AGAIN}}",
  "  g-external-antenna {{GGAIN}}",
  "  zonename zoneA",
  "  rf-zone newsite"
  ]
}

我试过什么使用我公司的 chatgpt 版本生成了多个失败的 javascript 模板,用于将 responsebody 从 GET 请求转换为正确的 JSON 格式(以便我可以适当地引用环境变量)。我在 GET 请求的 TESTS 中插入了这些模板。目前,我删除了设置环境变量,以便我可以专注于 javascript 模板并查看我记录新输出的控制台日志。但是,我得到的最好的是以下内容:

CONSOLE OUTPUT(用于转换为正确的 JSON 格式):

{per-ap-settings: "ab:xz:1x:5y:3c:65", "": " zonename _#ALL#_"}
per-ap-settings: "ab:xz:1x:5y:3c:65"
"": " zonename _#ALL#_"

重大编辑!!

我的新 Chatgpt 生成的 CODE 让我 99% 到达了我需要的地方。我只需要以下方面的帮助:

  1. 我不想删除出现在带有“ip-address”字样的行末尾的以下 4 个字符:

    ""

  2. 我需要确保我的 pm.environment.set 行的语法正确。我不认为他们现在是对的。

新代码(在 GET REQUEST 下测试中):

// Get the response body as a JSON object
responseBody = pm.response.json();

// Initialize an empty object to store the JSON format
const jsonFormat = {};

// Iterate through each line in the response body array
responseBody.forEach(line => {
  // Remove extra spaces and split the line by space to get the key-value pair
  // Exclude escaped quotes from being split
  const [key, ...valueParts] = line.trim().split(/(?<!\\) /);

  // Join the value parts back together and add the key-value pair to the jsonFormat object
  jsonFormat[key] = valueParts.join(' ');
});

// Log the jsonFormat object to the console
console.log(jsonFormat);
console.log(jsonFormat["per-ap-settings"])
console.log(jsonFormat.hostname);
console.log(jsonFormat["ip-address"])
console.log(jsonFormat["wifi0-mode"])
console.log(jsonFormat["wifi1-mode"])
console.log(jsonFormat["g-channel"])
console.log(jsonFormat["g-channel"])

// If you want to set the converted JSON as an environment variable, uncomment the following line:
// pm.environment.set("convertedJson", JSON.stringify(jsonFormat));


pm.environment.set("hostname", pm.response.json().hostname);
pm.environment.set("per-ap-settings", pm.response.json["per-ap-settings"]);
pm.environment.set("ip-address", pm.response.json["ip-address"]);
pm.environment.set("wifi0-mode", pm.response.json["wifi0-mode"]);
pm.environment.set("wifi1-mode", pm.response.json["wifi1-mode"]);
pm.environment.set("g-channel", pm.response.json["g-channel"]);
pm.environment.set("a-channel", pm.response.json["a-channel"]);

这是新的控制台日志 -> 注意“ip-address”行中缺少的两个\

{per-ap-settings: "dc:b7:ac:cd:e1:7e", hostname: "fw-cp-125-eorwdw-ap", ip-address: "0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 """…}
per-ap-settings: "dc:b7:ac:cd:e1:7e"
hostname: "fw-cp-125-eorwdw-ap"
ip-address: "0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 """
wifi0-mode: "access"
wifi1-mode: "access"
g-channel: "0 -127"
a-channel: "0 -127"
a-external-antenna: "0"
g-external-antenna: "0"
zonename: "_#ALL#_"
 
"dc:b7:ac:cd:e1:7e
 
"fw-cp-125-eorwdw-ap"
 
"0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 """
 
"access"
 
"access"
 
"0 -127"
 
"0 -127"
json 获取 邮递员

评论


答:

0赞 mikee 11/6/2023 #1

当您记录字符串时,控制台日志将不会显示转义字符。不过他们就在那里。

例如。。。

const response = pm.response.json();

let newObj = {}

response.forEach(element => {
    let split = element.trim().split(/(?<=^\S+)\s/);
    newObj[split[0]] = split[1]
})

console.log(newObj);
pm.environment.set("object",JSON.stringify(newObj))

返回的内容与控制台日志中的内容相同。

enter image description here

如果我然后使用该环境变量来驱动针对 Postman Echo 的下一个请求。

enter image description here

您可以看到转义字符仍然存在。

enter image description here