PowerShell Retry WebRequest - RateLimit
Wer beim Aufruf einer API immer wieder mal keine Antwort bekommt, kann mit folgender Funktion einen Retry implementieren. Die Funktion versucht den Aufruf nach einigen Sekunden erneut, nach jedem Versuch in immer größeren Abständen und gibt dann nach einer eingestellten Anzahl an Versuchen auf.
Invoke-WebRequestRetry
function Invoke-WebRequestRetry {
Param
(
$Uri,
$retrycount = 0
)
$args = @{
Uri = $uri
Headers = $global:headers
Method = "Get"
ContentType = "application/json"
}
try {
$result = (Invoke-WebRequest @args)
} catch {
if ($_.Exception -like "*404*") {
write-output "404 Not Found '$uri'"
return
} else {
$retrycount++
$waitSeconds = 10 * $retrycount
if ($retrycount -gt 10) {
write-error "$($_.Exception) '$uri'"
Throw "Retrycount exceeded"
}
write-output "$($_.Exception) URI: '$uri' will wait $($waitSeconds) Seconds Retry ($retrycount/10)"
Start-sleep $waitSeconds
Invoke-WebRequestRetry -uri $uri -retrycount $retrycount
}
}
if ($result.count -gt 0) {
return $result
}
}
Aufruf
$token="??????"
$global:headers=@{Authorization = "Bearer $token"}
Invoke-WebRequestRetry -uri "https://domain.api.domain/apirequest"
({{pro_count}})
Beitrag bewerten:{{percentage}} % positiv
({{con_count}})
DANKE für deine Bewertung!
Fragen / Kommentare
(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
Hallo Ich bin nur ein Anwender ohne Programmierkenntnisse auf der Suche nach einer Lösung für ein "Invoke-WebRequest " zB jede Stunde. Die entsprechende URL erwartet in regelmäßigen Abständen eingehende HTTP-Anfragen (GET oder POST) gefolgt von von zB. "?param=test" Kann sowas auf WinServer oder Win10/11 über ein Skript aktiviert und gelöst werden? Wie sieht sowas aus und wie bewerkstellige ich das? Über die Win Aufgabenplanung? Habe gelesen, die Policy von ".ps" muss angepasst werden? Idealerweise, aber nicht zwingend wie ein Dienst im Hintergrund. Mir scheint das "Invoke-WebRequestRetry" geht genau in dieser Richtung, die ich schon lange nach einer Lösung suche
Dazu gibt es sicherlich mehrere Möglichkeiten. Eine davon wäre ein Skript, dass in einer Endlosschleife jede Stunde den Request macht: Nachteil das Skript muss händisch von einem angemeldeten Benutzer gestartet werden. Stabiler ist wahrscheinlich die Aufgabenplanung. Wenn es nur um den Aufruf geht, ohne dass Daten empfangen werden müssen, würde sogare eine Zeile direkt in der Aufgabenplanung reichen, über -executionpolicy Bypass und -command, sowas wie: Programm: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe Parameter: -ExecutionPolicy Bypass -command "Invoke-WebRequest ..."
Beitrag erstellt von Bernhard