新遗物:脚本总是 returns 状态 400 但在 Postman 中有效

New Relic: Script always returns Status 400 but works in Postman

我正在尝试对我在 New Relic 中的服务进行健康检查。所以我只想每隔 x 分钟调用一次我的 API,看看它是否 returns 200。 在 New Relic 中,我创建了一个新的 synthetic monitor,现在我正在尝试为该监视器编写一个 script

该脚本应该向我们的服务发出 post 请求,并在响应中接收状态为 200 的令牌。在 Postman 中,此 post 请求有效并且 returns 令牌+ 状态 200(我用 <...> 替换了敏感字符串):

curl --location --request POST <TOKEN_URL> \

--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id=<CLIENT_ID_DEV>' \
--data-urlencode 'client_secret=<CLIENT_SECRET_DEV>'

但是当我尝试用脚本重新创建它时,它总是 returns 状态 400 错误请求。

这是我的脚本:

var assert = require('assert');

//Defining my authentication credentials.
var IDK_TOKEN_URL = $secure.TOKEN_URL;
var CLIENT_ID = $secure.CLIENT_ID_DEV;
var CLIENT_SECRET = $secure.CLIENT_SECRET_DEV;

var options = {
url: IDK_TOKEN_URL,
body: JSON.stringify({
  grant_type: 'client_credentials',
  client_id: CLIENT_ID,
  client_secret: CLIENT_SECRET,
}),
headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
    }
};

//Define expected results using callback function.
function callback(error, response, body) {
console.log(response.statusCode + " status code")
assert.ok(response.statusCode == 200, 'Expected 200 OK response');
var info = JSON.parse(body);
assert.ok(info.success == true, 'Expected True results in Response Body, result was ' + info.success);
console.log("End reached");
}

//Make POST request, passing in options and callback.
$http.post(options, callback);

这是我在控制台中看到的:

它似乎自动将端口 443 附加到我的 url,所以请求似乎被触发到 <my url>.io:443/oidc/v1/token?

而不是 <my url>.io/oidc/v1/token

当我点击上图中的“查看资源”时,我看到:

但我使用的是 post 方法,为什么它说不允许使用 get 方法?

这是我可以在新遗迹控制台下载的 HAR 日志:

"request": {

          "cookies": [],

          "headers": [

            {

              "name": "Content-Type",

              "value": "application/x-www-form-urlencoded"

            },

            {

              "name": "host",

              "value": "<my url>.io"

            },

            {

              "name": "content-length",

              "value": "187"

            },

            {

              "name": "X-Abuse-Info",

              "value": "Request sent by a New Relic Synthetics Monitor (https://docs.newrelic.com/docs/synthetics/new-relic-synthetics/administration/identify-synthetics-requests-your-app) - monitor id: df1817f0-fac2-49f4-a0d5-479d254dfa1a | account id: 2807718"

            },

            {

              "name": "X-NewRelic-Synthetics",

              "value": "[1,2807718,\"fddc843c-8fe0-497f-bf5b-52c2805a265e\",\"b6da79b9-37ab-4a8a-a792-f3fa0f99f205\",\"df1817f0-fac2-49f4-a0d5-479d254dfa1a\"]"

            }

          ],

          "headersSize": 607,

          "bodySize": 187,

          "method": "POST",

          "url": "<my url>.io:443/oidc/v1/token/",

          "httpVersion": "HTTP/1.1",

          "queryString": [],

          "postData": {

            "mimeType": "application/x-www-form-urlencoded",

            "text": "{\"grant_type\":\"client_credentials\",\"client_id\":\"_SECURECREDENTIAL_\",\"client_secret\":\"_SECURECREDENTIAL_\"}",

            "params": []

          },

          "_ajax": false,

          "_mixedContentType": "unknown",

          "_referrerPolicy": "",

          "_isLinkPreload": false,

          "_host": "<my url>.io",

          "_port": 443,

          "_path": "/oidc/v1/token/"

        },

        "response": {

          "cookies": [],

          "headers": [

            {

              "name": "Date",

              "value": "Thu, 06 May 2021 10:21:05 GMT"

            },

            {

              "name": "Content-Type",

              "value": "application/json"

            },

            {

              "name": "Content-Length",

              "value": "67"

            },

            {

              "name": "Connection",

              "value": "close"

            },

            {

              "name": "Cache-Control",

              "value": "no-cache, no-store, max-age=0, must-revalidate"

            },

            {

              "name": "Expires",

              "value": "0"

            },

            {

              "name": "Pragma",

              "value": "no-cache"

            },

            {

              "name": "Referrer-Policy",

              "value": "origin"

            },

            {

              "name": "Strict-Transport-Security",

              "value": "max-age=31536000 ; includeSubDomains"

            },

            {

              "name": "Vary",

              "value": "accept-encoding,origin,access-control-request-headers,access-control-request-method,accept-encoding"

            },

            {

              "name": "X-Content-Type-Options",

              "value": "nosniff"

            },

            {

              "name": "X-Frame-Options",

              "value": "DENY"

            },

            {

              "name": "X-Vcap-Request-Id",

              "value": "e2006a3c-0c27-4194-6b81-d9f037158ca3"

            },

            {

              "name": "X-Xss-Protection",

              "value": "1; mode=block"

            }

          ],

          "headersSize": 544,

          "bodySize": 67,

          "status": 400,

          "statusText": "Bad Request",

          "httpVersion": "HTTP/1.1",

          "content": {

            "size": 639,

            "compression": 572,

            "mimeType": "application/json",

            "text": ""

          },

          "redirectURL": "",

          "_chromeStatusText": "Bad Request",

          "_connectionReused": false,

          "_fromServiceWorker": false,

          "_fromDiskCache": false,

          "_fromAppCache": false,

          "_fromCache": false

        },

我不得不将 'body' 替换为 'form',就像在 this example 中一样。

我现在还添加了在收到令牌后对 API 的调用。最终脚本是:

var assert = require('assert');
//Define your authentication credentials.
var TOKEN_URL = $secure.TOKEN_URL;
var MY_SERVICE_BASE_URL = $secure.MY_SERVICE_BASE_URL_DEV;
var CLIENT_ID = $secure.CLIENT_ID_DEV;
var CLIENT_SECRET = $secure.CLIENT_SECRET_DEV;

function new_relic_callback(err, response, body) {
  assert.equal(response.statusCode, 200, 'Expected a 200 OK response');
};

function api_request_callback(err, response, body) {
  var parsed_body = JSON.parse(body); 
  
  var api_request = {
    url: CONSENT_BASE_URL + '/rest of URL...',
    headers: {
      'Authorization': 'Bearer ' + parsed_body["access_token"]
    }
  };

  $http.get(api_request, new_relic_callback);
};

var token_request = {
  url: TOKEN_URL,
  form: {
    client_id: CLIENT_ID,
    client_secret: CLIENT_SECRET,
    grant_type: "client_credentials"
  },
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
    }
};

$http.post(token_request, api_request_callback);