New Relic:脚本始终返回状态 400,但在 Postman 中工作

问题描述 投票:0回答:2

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

该脚本应该向我们的服务发出 post 请求,并在响应中接收状态为 200 的令牌。在 Postman 中,此 post 请求有效并返回令牌 + Status 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>'

但是当我尝试使用脚本重新创建它时,它总是返回 Status 400 Bad Request。

这是我的脚本:

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 附加到我的网址,因此该请求似乎被触发到

<my url>.io/oidc/v1/token
,而不是
<my url>.io:443/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

        },
node.js newrelic newrelic-synthetics
2个回答
0
投票

我必须将“body”替换为“form”,就像这个例子一样。

我现在还添加了在收到令牌后对 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);

0
投票

我无法监控 new Relic 中的邮递员 https API,您能帮助我处理该脚本吗?我也检查了上面的脚本,它对我不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.