提问人:protonarc 提问时间:11/4/2023 最后编辑:protonarc 更新时间:11/6/2023 访问量:64
POSTMAN - 在后续 POST 请求之前将 GET 请求的响应修改为 JSON 格式 - 几乎完成 - 请参阅编辑
POSTMAN - Modifying response for GET request to JSON format prior to subsequent POST request - ALMOST COMPLETED - SEE EDIT
问:
快速摘要:想要发出一个 GET 请求,其中响应正文转换为标准 JSON 格式,以便我可以在设置环境变量时指向这些非常 JSON 对象,这些环境变量将在随后的 POST 中引用。
详细背景:处理各种集合,这些集合从 Excel 工作表中循环访问无线接入点 (AP) 列表。此特定集合对 excel 列表中的每个 AP 都有一个 GET 和一个后续 POST:其目的是向 ARUBA CENTRAL API 发送 GET 请求,以根据 excel 中的 SERIAL# 值获取特定 AP 的配置(10 个属性)。然后,要发回具有 11 个属性的 POST 请求以重新配置 AP:
- 七个属性保持不变,因此从初始 GET 响应体引用
- 两个属性正在更改,它们的值取自 excel 工作表(简单)
- 两个属性是静态的(简单)
然后,它转到 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% 到达了我需要的地方。我只需要以下方面的帮助:
我不想删除出现在带有“ip-address”字样的行末尾的以下 4 个字符:
""
我需要确保我的 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"
答:
当您记录字符串时,控制台日志将不会显示转义字符。不过他们就在那里。
例如。。。
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 的下一个请求。
您可以看到转义字符仍然存在。
评论