0

I'm trying to make a healthcheck for my service in New Relic. So I just want to call one of my APIs every x minutes and see if it returns 200. In New Relic I created a new synthetic monitor and now I'm trying to write a script for that monitor.

The script is supposed to make a post request to our service and receive a token in the response with status 200. In Postman this post request works and returns the token + Status 200 (I replaced the sensitive strings with <...>):

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>'

But when I try to recreate that with the script, it always returns Status 400 Bad Request.

This is my script:

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

This is what I see in the console:

new relic console

It seems to automatically append a port 443 to my url, so instead of <my url>.io/oidc/v1/token, the request seems to get fired to <my url>.io:443/oidc/v1/token?

And when I click on "View resource" in the image above, I see:

![grafik|636x148](upload://k12h5iGDkE1m2JdTSvQ8L2Qcy2j.png)

But I'm using a post method, why is it saying anything about get method is not allowed?

This is the HAR log that I can download in the new relic console:

"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

        },
4

1 回答 1

0

我不得不像在这个例子中那样用 'form' 替换 'body' 。

在收到令牌后,我现在还添加了对 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);
于 2021-05-07T06:03:45.023 回答