Postman 邮递员post预请求在https上失败

Postman 邮递员post预请求在https上失败,postman,postman-pre-request-script,Postman,Postman Pre Request Script,我正在尝试设置一个邮递员预请求,以便在每次请求我的服务之前获得OAuth令牌 我试着遵循与此相关的各种示例和指南,每个示例和指南似乎都非常简单,但由于预请求脚本失败,我的脚本仍然存在问题 恐怕这与我需要调用以获取令牌的端点在http协议上而不是https这一事实有关,因为在邮递员控制台中,我总是收到两个对同一url的单独请求,一个在https上,另一个在http上 这是我的预请求脚本 pm.expect(pm.environment.has('host')).to.be.true; pm.exp

我正在尝试设置一个邮递员预请求,以便在每次请求我的服务之前获得OAuth令牌

我试着遵循与此相关的各种示例和指南,每个示例和指南似乎都非常简单,但由于预请求脚本失败,我的脚本仍然存在问题

恐怕这与我需要调用以获取令牌的端点在http协议上而不是https这一事实有关,因为在邮递员控制台中,我总是收到两个对同一url的单独请求,一个在https上,另一个在http上

这是我的预请求脚本

pm.expect(pm.environment.has('host')).to.be.true;
pm.expect(pm.environment.has('client_id')).to.be.true;
pm.expect(pm.environment.has('client_secret')).to.be.true;
pm.expect(pm.environment.has('username')).to.be.true;
pm.expect(pm.environment.has('password')).to.be.true;

var options = { method: 'POST',
  url: 'http://' + pm.environment.get("host") + '/api/oauth/token',
  headers: 
  { 
 Authorization: 'Basic '+btoa(pm.environment.get("client_id")+':'+pm.environment.get("client_secret")),
 'Content-Type': 'application/x-www-form-urlencoded' 

  },
  form: 
   { 
   grant_type: 'password',
   username: pm.environment.get('username'),
   password: pm.environment.get('password'),
   } 
};

pm.sendRequest(options, function(err, response) {
  console.log(response.json())
});
这是我在邮递员控制台上看到的

如图所示,第一个请求失败,第二个请求生成401HTTP响应

如果我在预请求脚本之外运行与http上的“常规”邮递员请求相同的请求,则一切正常,但在https上,我会收到一个错误,因为请求甚至没有发出


如何使我的请求前脚本正常工作?

根据您的示例代码,我相信您输入的“标题”有误。如果您将其更改为“header”,它应该可以工作

根据您的示例代码,我相信您输入了错误的“headers”。如果您将其更改为“header”,它应该可以工作

我终于明白了问题所在

pre脚本存在多个问题:

1) 双重响应实际上与双重预脚本相关,一个在集合级别,另一个在集合内部的文件夹级别

2) 请求本身必须更改,因为许多部分不正确。 正如前面所说的headers键错误,需要使用header键, 但正文也不正确,因为它需要特定的格式

在这里,您可以发现新请求工作正常


此预请求工作正常,并将oauth_令牌存储在适当的变量中

我终于找到了问题所在

pre脚本存在多个问题:

1) 双重响应实际上与双重预脚本相关,一个在集合级别,另一个在集合内部的文件夹级别

2) 请求本身必须更改,因为许多部分不正确。 正如前面所说的headers键错误,需要使用header键, 但正文也不正确,因为它需要特定的格式

在这里,您可以发现新请求工作正常


此预请求工作正常,并将oauth_令牌存储在适当的变量中

为什么不创建一个初始请求来检索oauth令牌,将结果保存在一个变量中,然后在另一个实际执行操作的请求中使用该变量?使您不必一直使用令牌检索预请求脚本。这基本上是我现在正在做的,但这将要求我在每次令牌过期时更新变量,这是我想要避免的。为什么不创建初始请求来检索OAuth令牌,将结果保存在变量中,然后在另一个实际执行操作的请求上使用该变量?使您不必一直使用令牌检索预请求脚本。这基本上是我现在正在做的,但这将要求我在每次令牌过期时更新变量,我想避免这种情况。不是这样,我已经尝试过,但问题仍然存在。当您将https请求作为普通请求(而不是请求前脚本)运行时,它是否工作?您的服务器是否希望SSL证书作为请求的一部分?如果没有,您是否尝试过禁用SSL证书验证(设置->常规)否https请求不起作用,服务器似乎不需要SSL证书。无论如何,我试图禁用SSL证书验证,但请求仍然无效不,不是这样,我已经尝试过,但问题仍然存在。当您将https请求作为普通请求(而不是请求前脚本)运行时,它是否工作?您的服务器是否希望SSL证书作为请求的一部分?如果没有,您是否尝试过禁用SSL证书验证(设置->常规)否https请求不起作用,服务器似乎不需要SSL证书。无论如何,我试图禁用SSL证书验证,但请求仍然不起作用
pm.expect(pm.environment.has('host')).to.be.true;
pm.expect(pm.environment.has('client_id')).to.be.true;
pm.expect(pm.environment.has('client_secret')).to.be.true;
pm.expect(pm.environment.has('username')).to.be.true;
pm.expect(pm.environment.has('password')).to.be.true;

var options = { 
  url: 'http://' + pm.environment.get("host") + '/api/oauth/token',
  method: 'POST',
  header: { 
Authorization: 'Basic '+btoa(pm.environment.get("client_id")+':'+pm.environment.get("client_secret")),
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json'
  },
  body: {
  mode: "urlencoded",
  urlencoded: [
      {key: "grant_type", value: "password", disabled: false},
      {key: "username", value: pm.environment.get('username'), disabled: false},
      {key: "password", value:  pm.environment.get('password'), disabled: false}
    ]
  }
};

pm.sendRequest(options, function(err, response) {
  pm.environment.set("oauth_token", response.json().access_token)
});