Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
7 years ago
Solved

Delay web query until condition met from another web query

I use an API that provides a Json response which includes a statusUrl and a downloadUrl.

If I immediately hit up the downloadUrl there is usually no data.

The statusUrl Json response advises when the report generation is "COMPLETE" and the reportUrl can be used to get the data.

 

Can I set up some sort of condition to check that a value in the statusUrl Json response (which I can convert to a normal table or list if easier) = "COMPLETE" or if it's "FAILED" or if it's "NOT READY"?

Then if it shows "COMPLETE" it runs Csv.Document(Web.Contents(downloadUrl),...) , if it's "NOT READY" it delays for a few seconds and tries again (a loop?) and if it's "FAILED" the output is an error message.

  • Hi Anonymous,

    I've prepared a template which you can use for solving your problem.

    You have to add your logic for processing JSON responses and modify the WaitForList according your needs.

    let
        // request data
        RequestDataRecord = fnProcessJson(Web.Contents("request data URL")),
    
        // wait 10x for 5 seconds
        WaitForList = List.Repeat({5}, 10),
    // wait until the response is COMPLETE, but max 50 secs WaitForStatus = List.MatchesAny( WaitForList, each Function.InvokeAfter( () => fnProcessJson(Web.Contents("http://StatusCheckURL")), #duration(0,0,0,_) ) = "COMPLETE" ), // download file if WaitForStatus was successful DownloadFile = if WaitForStatus then fnProcessJson(Web.Contents("download data URL")) else null in DownloadFile

7 Replies

  • Nolock's avatar
    Nolock
    Resident Rockstar

    Hi Anonymous,

    I've prepared a template which you can use for solving your problem.

    You have to add your logic for processing JSON responses and modify the WaitForList according your needs.

    let
        // request data
        RequestDataRecord = fnProcessJson(Web.Contents("request data URL")),
    
        // wait 10x for 5 seconds
        WaitForList = List.Repeat({5}, 10),
    // wait until the response is COMPLETE, but max 50 secs WaitForStatus = List.MatchesAny( WaitForList, each Function.InvokeAfter( () => fnProcessJson(Web.Contents("http://StatusCheckURL")), #duration(0,0,0,_) ) = "COMPLETE" ), // download file if WaitForStatus was successful DownloadFile = if WaitForStatus then fnProcessJson(Web.Contents("download data URL")) else null in DownloadFile
    • Anonymous's avatar
      Anonymous
      Not applicable

      Thanks, Nolock 
      Looks like this will do the job, just working through it at the moment.


      What should the output of the function in the middle be? Should it be text? a list?

      I think that's where I'm failing now..

       

      • Nolock's avatar
        Nolock
        Resident Rockstar

        Hi Anonymous,

        do you mean this function? 

        () => fnProcessJson(Web.Contents("http://StatusCheckURL"))

        The result should be the status (i.e. COMPLETE, INPROGRESS, FAILED, ...) and its datatype is text because I compare it with the string "COMPLETE" on the next line.

        But you can modify the code in a form which fulfils all your expectations. It is just a template how it could work.

    • Anonymous's avatar
      Anonymous
      Not applicable

      The first response you wrote was correct, I just wasn't calling my function correctly!
      Thanks for your help.

    • ayangain17's avatar
      ayangain17
      New Member

      Now it doesn't seem to work is there any workaround? the response is not getting updated so null is being returned always, but in postman the response gets completed within few seconds