Μοτίβο επανάληψης αναμονής
Σε ορισμένες περιπτώσεις, η συμπεριφορά μιας προέλευσης δεδομένων δεν συμφωνεί με αυτή που αναμένεται από τον προεπιλεγμένο χειρισμό κώδικα HTTP του Power Query. Τα παρακάτω παραδείγματα δείχνουν πώς μπορείτε να επιλύσετε αυτή την κατάσταση.
Σε αυτό το σενάριο θα εργάζεστε με ένα REST API που επιστρέφει περιστασιακά έναν κωδικό κατάστασης 500, που υποδεικνύει ένα εσωτερικό σφάλμα διακομιστή. Σε αυτές τις παρουσίες, θα μπορούσατε να περιμένετε μερικά δευτερόλεπτα και να προσπαθήσετε ξανά, πιθανώς μερικές φορές πριν τα παρατήσετε.
Εάν Web.Contents
λάβει μια απόκριση κωδικού κατάστασης 500, εμφανίζει μια DataSource.Error
από προεπιλογή. Μπορείτε να παρακάμψετε αυτή τη συμπεριφορά παρέχοντας μια λίστα κωδικών ως προαιρετικό όρισμα στο Web.Contents
:
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
Καθορίζοντας τους κωδικούς κατάστασης με αυτόν τον τρόπο, το Power Query θα συνεχίσει να επεξεργάζεται την απόκριση Web κανονικά. Ωστόσο, η κανονική επεξεργασία απόκρισης συχνά δεν είναι κατάλληλη σε αυτές τις περιπτώσεις. Θα πρέπει να κατανοήσετε ότι έχει ληφθεί ένας μη φυσιολογικός κωδικός απόκρισης και να εκτελέσετε ειδική λογική για τον χειρισμό του. Για να προσδιορίσετε τον κωδικό απόκρισης που επιστρέφεται από την υπηρεσία Web, μπορείτε να αποκτήσετε πρόσβαση σε αυτόν από την meta
Εγγραφή που συνοδεύει την απόκριση:
responseCode = Value.Metadata(response)[Response.Status]
Ανάλογα με το αν responseCode
είναι 200 ή 500, μπορείτε είτε να επεξεργαστείτε το αποτέλεσμα κανονικά, είτε να ακολουθήσετε τη λογική σας επανάληψης αναμονής που θα ολοκληρώσετε στην επόμενη ενότητα.
Το Power Query διαθέτει ένα τοπικό cache που αποθηκεύει τα αποτελέσματα προηγούμενων κλήσεων στο Web.Contents. Όταν ανιχνεύετε την ίδια διεύθυνση URL για μια νέα απόκριση ή όταν προσπαθήσετε ξανά μετά από μια κατάσταση σφάλματος, θα χρειαστεί να εξασφαλίσετε ότι το ερώτημα αγνοεί τυχόν προσωρινά αποθηκευμένα αποτελέσματα. Μπορείτε να το κάνετε αυτό, συμπεριλαμβάνοντας την IsRetry
επιλογή στην κλήση της συνάρτησης Web.Contents
. Σε αυτό το δείγμα, θα οριστεί IsRetry
σε true
μετά την πρώτη επανάληψη του Value.WaitFor
βρόχου.
Value.WaitFor()
Το είναι μια τυπική συνάρτηση βοηθητικής εφαρμογής που μπορεί συνήθως να χρησιμοποιηθεί χωρίς τροποποίηση. Λειτουργεί δημιουργώντας μια Λίστα προσπαθειών επανάληψης.
Περιέχει την εργασία που θα (πιθανώς) επαναληφθεί. Αντιπροσωπεύεται ως συνάρτηση, έτσι ώστε ο αριθμός επανάληψης να μπορεί να χρησιμοποιηθεί στη producer
λογική. Η αναμενόμενη συμπεριφορά είναι ότι producer
θα επιστρέψει null
εάν μια επανάληψη κριθεί απαραίτητη. Εάν επιστρέφεται producer
κάτι διαφορετικό από null
το , αυτή η τιμή επιστρέφεται με τη σειρά από Value.WaitFor
το .
Αυτό περιέχει τη λογική για εκτέλεση μεταξύ επαναλήψεων. Αντιπροσωπεύεται ως συνάρτηση, έτσι ώστε ο αριθμός επανάληψης να μπορεί να χρησιμοποιηθεί στη delay
λογική. Η αναμενόμενη συμπεριφορά είναι αυτή που delay
επιστρέφει μια διάρκεια.
Ένας μέγιστος αριθμός επαναλήψεων μπορεί να οριστεί, παρέχοντας έναν αριθμό στο count
όρισμα.
Το παρακάτω παράδειγμα δείχνει πώς ManualStatusHandling
και Value.WaitFor
μπορεί να χρησιμοποιηθεί για την υλοποίηση μιας καθυστερημένης επανάληψης σε περίπτωση απόκρισης 500. Ο χρόνος αναμονής μεταξύ των επαναλήψεων διπλασιάζεται με κάθε δοκιμή, με μέγιστο αριθμό πέντε επαναλήψεων.
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