รูปแบบการรอใหม่
ในบางสถานการณ์ ลักษณะการทํางานของแหล่งข้อมูลไม่ตรงกับที่คาดหมายโดยการจัดการรหัส HTTP เริ่มต้นของ Power Query ตัวอย่างด้านล่างแสดงวิธีการแก้ไขสถานการณ์นี้
ในสถานการณ์นี้ คุณจะทํางานกับ REST API ซึ่งบางครั้งจะส่งกลับรหัสสถานะ 500 ซึ่งระบุถึงข้อผิดพลาดของเซิร์ฟเวอร์ภายใน ในกรณีเหล่านี้ คุณสามารถรอสักครู่ แล้วลองใหม่อีกครั้ง ซึ่งอาจเกิดขึ้นสักสองสามครั้งก่อนที่คุณจะยอมแพ้
ถ้า Web.Contents
ได้รับการตอบกลับรหัสสถานะ 500 รายการ ระบบจะโยนไป DataSource.Error
ตามค่าเริ่มต้น คุณสามารถแทนลักษณะการทํางานนี้ได้โดยการให้รายการโค้ดเป็นอาร์กิวเมนต์ทางเลือกเป็น Web.Contents
:
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
ด้วยการระบุรหัสสถานะด้วยวิธีนี้ Power Query จะยังคงประมวลผลการตอบสนองของเว็บตามปกติ อย่างไรก็ตาม การประมวลผลการตอบสนองปกติมักไม่เหมาะสมในกรณีเหล่านี้ คุณจะต้องเข้าใจว่าได้รับรหัสการตอบสนองที่ผิดปกติและดําเนินการตรรกะพิเศษเพื่อจัดการรหัสดังกล่าว หากต้องการกําหนดรหัสการตอบสนองที่ถูกส่งกลับจากบริการเว็บ คุณสามารถเข้าถึงได้จาก meta
บันทึกที่มาพร้อมกับการตอบสนอง:
responseCode = Value.Metadata(response)[Response.Status]
ขึ้นอยู่กับว่า responseCode
คือ 200 หรือ 500 คุณสามารถประมวลผลผลลัพธ์เป็นปกติ หรือทําตามตรรกะการรอลองใหม่ของคุณที่คุณจะสร้างในส่วนถัดไป
Power Query มีแคชภายในเครื่องที่จัดเก็บผลลัพธ์ของการเรียกไปยัง Web.Contents ก่อนหน้านี้ เมื่อทําการโพลล์ URL เดียวกันสําหรับการตอบกลับใหม่หรือเมื่อลองใหม่หลังจากสถานะข้อผิดพลาด คุณจะต้องตรวจสอบให้แน่ใจว่าคิวรีนั้นละเว้นผลลัพธ์ที่แคชไว้ คุณสามารถทําได้โดยการรวมIsRetry
ตัวเลือก ในการเรียกฟังก์ชันWeb.Contents
ในตัวอย่างนี้ เราจะตั้งค่า IsRetry
เป็น true
หลังจากการเกิดซ้ําครั้งแรกของ Value.WaitFor
รอบ
Value.WaitFor()
เป็นฟังก์ชันผู้ช่วยเหลือมาตรฐานที่โดยปกติแล้วจะสามารถใช้ได้โดยไม่มีการปรับเปลี่ยน ซึ่งทํางานโดยการสร้างรายการของความพยายามอีกครั้ง
ซึ่งประกอบด้วยงานที่จะลองใหม่ (อาจเป็น) ซึ่งแสดงเป็นฟังก์ชัน เพื่อให้สามารถใช้หมายเลขการเกิดซ้ําใน producer
ตรรกะได้ ลักษณะการทํางานที่คาดไว้คือการ producer
ส่งกลับ null
ถ้ามีการกําหนดลองใหม่ให้จําเป็น ถ้าค่าอื่นนอกเหนือจาก null
ถูกส่งกลับโดย producer
ค่าดังกล่าวจะกลับเป็นค่าที่ส่งกลับโดย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