Если вы знаете, какой код ответа правильный, то отключите исключения 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 , который сначала выполнит блок кода , а затем проверит условие, чтобы увидеть, следует ли продолжать выполнение этого кода.