Baca dalam bahasa Inggris

Bagikan melalui


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.

ManualStatusHandling

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.

IsRetry

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

Value.WaitFor()adalah fungsi pembantu standar yang biasanya dapat digunakan tanpa modifikasi. Ini bekerja dengan membangun Daftar upaya coba lagi.

producer Argumen

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.

delay Argumen

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.

count Argumen (opsional)

Jumlah maksimum percobaan ulang dapat diatur dengan memberikan angka ke count argumen.

Menempatkan Semuanya Bersama-sama

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