You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS脚本中GET请求结果作为POST请求体重复问题修复

问题描述

我正在编写一段JS脚本,通过for循环发起GET请求获取JSON格式的特定信息,这部分功能运行正常。但在每次循环结束后,我需要将前一次GET请求的响应体作为POST请求的请求体发送,却遇到了无法正确传递请求体的问题——无论是否设置setTimeout,POST请求总是发送相同的请求体。

示例代码:

pm.sendRequest({
    url: requestUrl,
    method: 'GET',
    header: {
        'Content-Type': 'application/json',   
    },            
}, function(err, getresponse) {
    if (err) {
        console.error(err);
        return;
    }
    console.log("response: ", getresponse.json());
    pm.environment.set('POSTResponseBody', JSON.stringify(getresponse.json()));
});

setTimeout(function () {
    const POSTBody = pm.environment.get('POSTResponseBody');         
    const putRequestUrlPPR = 'https://postURL';   
    
    pm.sendRequest({
        url: putRequestUrlPPR,
        method: 'POST',
        header: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',               
        },
        body: {
            raw: pm.environment.get('POSTBody')              
        }
    }, function(err, response) {
        if (err) {
            console.error(err);
            return;
        }
        console.log(response.json());
    }); //end of POST REQUEST
}, 1000); // end of time out   

修复方案

核心问题分析

  1. 异步时序与变量覆盖:for循环同步执行,但pm.sendRequest是异步操作,加上setTimeout延迟,会导致所有POST请求大概率拿到最后一次GET存入环境变量的值。
  2. 请求体获取错误:POST请求的body.raw错误调用pm.environment.get('POSTBody'),实际上POSTBody已经是从环境变量取出的变量,且通过环境变量中转完全没必要,反而增加出错风险。

具体修复步骤

  • 直接在GET回调内发起POST:把POST请求嵌套在GET的回调函数里,确保每次GET请求完成后立刻用当前响应体发送POST,从根源避免时序问题和变量覆盖。
  • 移除环境变量中转:直接使用GET响应的JSON数据构造POST请求体,省去存、取环境变量的冗余操作。
  • 循环场景下用async/await控序:如果是循环执行多组请求,用async/await把异步请求转为同步执行,保证每组请求按顺序完成。

修正后的代码

单组请求的修正(对应原代码结构)

pm.sendRequest({
    url: requestUrl,
    method: 'GET',
    header: {
        'Content-Type': 'application/json',   
    },            
}, function(err, getresponse) {
    if (err) {
        console.error(err);
        return;
    }
    const getResponseData = getresponse.json();
    console.log("response: ", getResponseData);
    
    // 直接在GET回调内发起POST请求
    const postRequestUrl = 'https://postURL';   
    pm.sendRequest({
        url: postRequestUrl,
        method: 'POST',
        header: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',               
        },
        body: {
            raw: JSON.stringify(getResponseData)              
        }
    }, function(err, response) {
        if (err) {
            console.error(err);
            return;
        }
        console.log(response.json());
    });
});

循环场景下的修正(确保请求顺序)

// 假设你有一组待请求的URL列表
const requestUrls = ['https://get-url-1', 'https://get-url-2', 'https://get-url-3'];

// 用async函数处理循环,保证请求顺序
async function processRequests() {
    for (const url of requestUrls) {
        try {
            // 等待GET请求完成
            const getResponse = await pm.sendRequest({
                url: url,
                method: 'GET',
                header: {
                    'Content-Type': 'application/json',   
                }
            });
            const getResponseData = getResponse.json();
            console.log("GET response: ", getResponseData);
            
            // 用当前GET响应发起POST请求
            const postResponse = await pm.sendRequest({
                url: 'https://postURL',
                method: 'POST',
                header: {
                    'Content-Type': 'application/json',
                    'Accept': 'application/json',               
                },
                body: {
                    raw: JSON.stringify(getResponseData)              
                }
            });
            console.log("POST response: ", postResponse.json());
        } catch (err) {
            console.error("请求出错: ", err);
        }
    }
}

// 执行处理函数
processRequests();

内容的提问来源于stack exchange,提问作者Goul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:42:49