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

问题描述 投票:0回答:1

小结: 想要发出一个 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 中的下一个序列号,以进行下一组 get/post 请求,依此类推。

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

获取:

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

->这会将 GET 发送到 Aruba Central 的 API,其中包含从 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#_"
}

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

当前测试(在获取请求下)

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,该 POST 失败是因为未设置环境变量(来自 GET),并且未设置它们是因为我的响应正文不是典型的 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 模板,将响应正文从 GET 请求转换为正确的 JSON 格式(以便我可以适当地引用环境变量)。我将这些模板插入到我的 GET REQUEST 中的 TESTS 中。目前,我删除了设置环境变量,这样我就可以专注于 javascript 模板并查看我正在记录新输出的控制台日志。然而,我得到的最好的结果如下:

控制台输出(用于转换为正确的 JSON 格式):

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

主要编辑!!

我的 Chatgpt 生成的新代码已达到我需要的 99%。我只需要帮助:

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

    “”

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

新代码(在“获取请求”下进行测试):

// 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 get postman
1个回答
0
投票

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

例如...

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))

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.