Как решить / обработать случайную ошибку API 400 - PullRequest
0 голосов
/ 04 мая 2019

У меня есть простой скрипт, который делает вызовы к 8 различным API каждые 30 минут.Только один из этих API возвращает ошибку 400 неверных запросов примерно раз в пару дней, что кажется немного странным.Может кто-нибудь подсказать, что я делаю неправильно, или, может быть, простой способ повторить вызов при сбое, если это не моя вина?

var hayurl = "https://api.naturalresources.wales/riverlevels/v1/all?Location=4016";

var hayheaders = {
  "contentType": "application/json",
  "headers": {"Ocp-Apim-Subscription-Key": "xxxxxxxxxxxx"}
};

var hayresponse = UrlFetchApp.fetch(hayurl, hayheaders);

В большинстве случаев он просто возвращает нужные мне данные, но иногданеудачи меня поставили в тупик!

1 Ответ

1 голос
/ 04 мая 2019

Если вы знаете, какой код ответа правильный, то отключите исключения HTTP и проверьте его, используя HTTPResponse.getResponseCode().В приведенном ниже примере я предполагаю, что правильный код ответа - 200.

function getApiData() {
  var url = "https://api.naturalresources.wales/riverlevels/v1/all?Location=4016";
  var params = {
    "contentType": "application/json",
    "headers": {"Ocp-Apim-Subscription-Key": "xxxxxxxxxxxx"},
    "muteHttpExceptions": true // Without this, you'll still get an error
  };
  var maximumAttempts = 5; // Set a limit of retry attempts to prevent an infinite loop
  var attemptCount = 0;
  do { // Execute this block
    attemptCount++; // This needs to be BEFORE the request in case of failure, otherwise it will never increment
    var response = UrlFetchApp.fetch(url, params);
  } while (response.getResponseCode() != 200 && attemptCount < maximumAttempts); // If not 200, execute the block again
  return response;
}

В качестве альтернативы используйте оператор try ... catch .Если вы используете этот метод, вам не нужно отключать исключения HTTP и знать точный код успешного ответа.При отключении muteHttpExceptions (по умолчанию оно отключено) вызов UrlFetchApp.fetch() выдаст ошибку, которую вы видели.Мы рассчитываем на то, что это произойдет, потому что ошибка будет перехвачена и затем вызовет попытку повторной попытки.Это может быть предпочтительной стратегией, потому что она будет отлавливать другие ошибки, в то время как мой первый подход отлавливает только очень конкретный случай, когда код ответа не совсем 200.

function getApiData() {
  var url = "https://api.naturalresources.wales/riverlevels/v1/all?Location=4016";
  var params = {
    "contentType": "application/json",
    "headers": {"Ocp-Apim-Subscription-Key": "xxxxxxxxxxxx"}
  };
  var maximumAttempts = 5; // Set a limit of retry attempts to prevent an infinite loop
  var attemptCount = 0;
  do { // Execute this block
    var isErrored = false; // Reset to false at the start of each new iteration
    try {
      attemptCount++; // This needs to be BEFORE the request in case of failure, otherwise it will never increment
      var response = UrlFetchApp.fetch(url, params);
    } catch (err) {
      isErrored = true; // If there was an error, set to true so the script will try again
    }
  } while (isErrored && attemptCount < maximumAttempts); // If isErrored, execute the block again
  return response;
}

На всякий случай, если вы не знакомы с логикой зацикливанияЯ использую оператор do ... while , который сначала выполнит блок кода , а затем проверит условие, чтобы увидеть, следует ли продолжать выполнение этого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...