【问题标题】:Postman post pre-request failing on https邮递员在 https 上发布预请求失败
【发布时间】:2019-06-04 09:36:23
【问题描述】:

我正在尝试设置一个 Postman 预请求,以便在我向我的服务发出每个请求之前获取 OAuth 令牌。

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

恐怕这与以下事实有关,一个在 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())
});

这是我在 Postman 控制台中看到的内容

从图中可以看出,第一个请求失败,第二个请求生成 401 HTTP 响应。

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

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

【问题讨论】:

  • 为什么不创建一个初始请求来检索 OAuth 令牌,将结果保存在一个变量中,然后在另一个实际执行操作的请求中使用该变量?使您免于一直使用令牌检索预请求脚本。
  • 这基本上是我现在正在做的事情,但这需要我在每次令牌过期时更新变量,我希望避免这种情况

标签: postman postman-pre-request-script


【解决方案1】:

我终于知道问题出在哪里了。

前置脚本存在多个问题:

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

2) 请求本身必须更改,因为许多部分不正确。 正如Mo a 所说的标题键错误并且需要成为标题, 但正文也不正确,因为它需要特定的格式。

在这里您可以找到新的请求正常工作

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)
});

此预请求完美运行,并将 oauth_token 存储在适当的变量中

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不,不是这种情况,我试过了,但问题仍然存在
    • 我明白了。当您将 https 请求作为普通请求(而不是预请求脚本)运行时,它是否有效?您的服务器是否期望 SSL 证书作为请求的一部分?如果没有,您是否尝试过禁用 SSL 证书验证(设置 -> 常规)
    • 不,https 请求不起作用,服务器似乎不需要 SSL 证书。无论如何,我尝试禁用 SSL 证书验证,但请求仍然不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多