Pola Coba Lagi Tunggu
Dalam beberapa situasi, perilaku sumber data tidak cocok dengan yang diharapkan oleh penanganan kode HTTP default Power Query. Contoh di bawah ini menunjukkan cara mengatasi situasi ini.
Dalam skenario ini Anda akan bekerja dengan REST API yang terkadang mengembalikan kode status 500, yang menunjukkan kesalahan server internal. Dalam kasus ini, Anda dapat menunggu beberapa detik dan mencoba kembali, berpotensi beberapa kali sebelum Anda menyerah.
Jika Web.Contents
mendapatkan respons kode status 500, respons kode status akan dilemparkan DataSource.Error
secara default. Anda dapat mengambil alih perilaku ini dengan memberikan daftar kode sebagai argumen opsional untuk Web.Contents
:
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
Dengan menentukan kode status dengan cara ini, Power Query akan terus memproses respons web seperti biasa. Namun, pemrosesan respons normal sering kali tidak tepat dalam kasus ini. Anda harus memahami bahwa kode respons abnormal telah diterima dan melakukan logika khusus untuk menanganinya. Untuk menentukan kode respons yang dikembalikan dari layanan web, Anda dapat mengaksesnya dari meta
Rekaman yang menyertai respons:
responseCode = Value.Metadata(response)[Response.Status]
Berdasarkan apakah responseCode
200 atau 500, Anda dapat memproses hasilnya seperti biasa, atau mengikuti logika coba lagi tunggu yang akan Anda keluarkan di bagian berikutnya.
Power Query memiliki cache lokal yang menyimpan hasil panggilan sebelumnya ke Web.Contents. Saat melakukan polling URL yang sama untuk respons baru, atau saat mencoba kembali setelah status kesalahan, Anda harus memastikan bahwa kueri mengabaikan hasil yang di-cache. Anda dapat melakukan ini dengan menyertakan IsRetry
opsi dalam panggilan ke Web.Contents
fungsi . Dalam sampel ini, kita akan mengatur IsRetry
ke true
setelah perulangan pertama dari perulangan Value.WaitFor
.
Value.WaitFor()
adalah fungsi pembantu standar yang biasanya dapat digunakan tanpa modifikasi. Ini bekerja dengan membangun Daftar upaya coba lagi.
Ini berisi tugas yang akan (mungkin) dicoba kembali. Ini dinyatakan sebagai fungsi sehingga nomor iterasi dapat digunakan dalam producer
logika. Perilaku yang diharapkan adalah yang producer
akan kembali null
jika percobaan ulang ditentukan untuk diperlukan. Jika sesuatu selain null
dikembalikan oleh producer
, nilai tersebut pada gilirannya dikembalikan oleh Value.WaitFor
.
Ini berisi logika untuk dijalankan di antara percobaan ulang. Ini dinyatakan sebagai fungsi sehingga nomor iterasi dapat digunakan dalam delay
logika. Perilaku yang diharapkan adalah yang delay
mengembalikan Durasi.
Jumlah maksimum percobaan ulang dapat diatur dengan memberikan angka ke count
argumen.
Contoh berikut menunjukkan cara ManualStatusHandling
dan Value.WaitFor
dapat digunakan untuk menerapkan coba lagi yang tertunda jika terjadi respons 500. Waktu tunggu antara percobaan ulang dua kali lipat dengan setiap percobaan, dengan maksimum lima percobaan ulang.
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