邮递员:根据程序的输出设置请求 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);
});
}
我需要向接受身份验证令牌的 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);
});
}