邮递员:根据程序的输出设置请求 header

Postman: Set a request header from the output of a program

我需要向接受身份验证令牌的 API 发出请求,我希望能够通过 运行ning cmd.exe /c GenerateToken.bat 使用动态生成的令牌,而不必 运行我的程序,然后每次都手动把值粘贴到Postman中。

我想像这样的东西:

如何设置 HTTP header 的值以包含程序或批处理文件的标准输出输出?

简短的回答是,你不能。这是故意的,pre-request 和测试脚本(除了 collection 运行ner 之外,使您的环境动态的唯一方法)运行 在邮递员沙箱中,功能有限。

postman-sandbox Github repository page and in postman docs 中提供了有关可用内容的更多信息(滚动到底部以查看可以导入的库)

您确实有几个选项,如评论中所述 - 邮递员允许发送请求并在脚本中解析响应,因此您可以通过这种方式实现自动化。您确实需要一个服务器来处理请求并执行您的脚本(最简单的选择可能是支持 CGI 的小型服务器 - 我不会在这里详细说明,因为我觉得这个答案的范围太大了。其他选项也可用,例如小型 PHP 或节点服务器)

一旦您有了服务器,pre-request 脚本就非常简单了:

const requestOptions = {
    url: `your_server_endpoint`,
    method: 'GET'
}
pm.sendRequest(requestOptions, function (err, res) {
    if (err) {
        throw new Error(err);
    } else if (res.code != 200) {
        throw new Error(`Non-200 response when fetching token: ${res.code} ${res.status}`);
    } else {
        var token = res.text();
        pm.environment.set("my_token", token);
    }
});

然后您可以在“Headers”选项卡中将 header 设置为 {{my_token}},它会在脚本 运行s 后更新。

您可以在集合级别的预请求脚本中执行类似的操作。

Postman 提供 9 种不同的授权和身份验证方法。

这是取自此 article 的示例代码,展示了如何在 OAuth2 的预请求脚本中执行此操作

// Refresh the OAuth token if necessary
var tokenDate = new Date(2010,1,1);
var tokenTimestamp = pm.environment.get("OAuth_Timestamp");
if(tokenTimestamp){
  tokenDate = Date.parse(tokenTimestamp);
}
var expiresInTime = pm.environment.get("ExpiresInTime");
if(!expiresInTime){
    expiresInTime = 300000; // Set default expiration time to 5 minutes
}
if((new Date() - tokenDate) >= expiresInTime) 
{
   pm.sendRequest({
      url:  pm.variables.get("Auth_Url"), 
      method: 'POST',
      header: {
        'Accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': pm.variables.get("Basic_Auth")
      }
  }, function (err, res) {
        pm.environment.set("OAuth_Token", res.json().access_token);
        pm.environment.set("OAuth_Timestamp", new Date());
        
        // Set the ExpiresInTime variable to the time given in the response if it exists
        if(res.json().expires_in){
            expiresInTime = res.json().expires_in * 1000;
        }
        pm.environment.set("ExpiresInTime", expiresInTime);
  });
}