Bekleme-Yeniden Deneme Düzeni
Bazı durumlarda, bir veri kaynağının davranışı Power Query'nin varsayılan HTTP kodu işlemesi tarafından beklenen davranışla eşleşmez. Aşağıdaki örneklerde bu duruma geçici bir çözüm bulabilirsiniz.
Bu senaryoda, zaman zaman bir iç sunucu hatasına işaret eden 500 durum kodu döndüren bir REST API ile çalışacaksınız. Bu örneklerde, vazgeçmeden önce birkaç saniye bekleyip yeniden deneyebilirsiniz.
500 durum kodu yanıtı alırsa Web.Contents
varsayılan olarak bir DataSource.Error
oluşturur. için isteğe bağlı bağımsız değişken Web.Contents
olarak bir kod listesi sağlayarak bu davranışı geçersiz kılabilirsiniz:
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
Durum kodlarını bu şekilde belirterek Power Query web yanıtını normal şekilde işlemeye devam eder. Ancak bu durumlarda normal yanıt işleme genellikle uygun değildir. Anormal bir yanıt kodunun alındığını anlamanız ve bunu işlemek için özel mantık gerçekleştirmeniz gerekir. Web hizmetinden döndürülen yanıt kodunu belirlemek için, yanıta eşlik eden Kayıt'tan meta
erişebilirsiniz:
responseCode = Value.Metadata(response)[Response.Status]
200 veya 500 olup olmadığına responseCode
bağlı olarak, sonucu normal şekilde işleyebilir veya sonraki bölümde açıklayabileceğiniz bekleme yeniden deneme mantığınızı izleyebilirsiniz.
Power Query'de, Web.Contents'e yapılan önceki çağrıların sonuçlarını depolayan yerel bir önbellek vardır. Yeni yanıt için aynı URL'yi yoklarken veya hata durumundan sonra yeniden denerken sorgunun önbelleğe alınan sonuçları yoksaydığından emin olmanız gerekir. İşlev çağrısına IsRetry
Web.Contents
seçeneğini ekleyerek bunu yapabilirsiniz. Bu örnekte, döngünün ilk yinelemesinin Value.WaitFor
ardından olarak true
ayarlayacağızIsRetry
.
Value.WaitFor()
genellikle değişiklik yapılmadan kullanılabilen standart bir yardımcı işlevdir . Yeniden deneme girişimleri listesi oluşturarak çalışır.
Bu, (büyük olasılıkla) yeniden denenecek görevi içerir. Yineleme numarasının mantıkta producer
kullanılabilmesi için bir işlev olarak temsil edilir. Beklenen davranış, producer
yeniden denemenin gerekli olduğu belirlenirse döndürülmesidir null
. dışında null
bir şey tarafından producer
döndürülürse, bu değer sırayla tarafından Value.WaitFor
döndürülür.
Bu, yeniden denemeler arasında yürütülecek mantığı içerir. Yineleme numarasının mantıkta delay
kullanılabilmesi için bir işlev olarak temsil edilir. Beklenen davranış bir Süre döndürmektir delay
.
Bağımsız değişkene bir sayı count
sağlanarak en fazla yeniden deneme sayısı ayarlanabilir.
Aşağıdaki örnek, 500 yanıt durumunda gecikmeli yeniden deneme uygulamak için nasıl ManualStatusHandling
ve Value.WaitFor
kullanılabileceğini gösterir. Yeniden denemeler arasındaki bekleme süresi her denemede ikiye katlanarak en fazla beş yeniden deneme olur.
let
waitForResult = Value.WaitFor(
(iteration) =>
let
result = Web.Contents(url, [ManualStatusHandling = {500}, IsRetry = iteration > 0]),
status = Value.Metadata(result)[Response.Status],
actualResult = if status = 500 then null else result
in
actualResult,
(iteration) => #duration(0, 0, 0, Number.Power(2, iteration)),
5)
in
if waitForResult = null then
error "Value.WaitFor() Failed after multiple retry attempts"
else
waitForResult