I've developed a method that does the following steps, in this order:
1) Get a report's metadata via /gdc/md//obj/
2) From that, get the report definition and use that as payload for a call to /gdc/xtab2/executor3
3) Use the result from that call as payload for a call to /gdc/exporter/executor
4) Perform a GET on the returned URI to download the generated CSV
So this all works fine, but the problem is that I often get back a blank CSV or an incomplete CSV. My workaround has been to put a sleep() in between getting the URI back and actually calling a GET on the URI. However, as our data grows, I have to keep increasing the delay on this, and even then it is no guarantee that I got complete data. Is there a way to make sure that the report has finished exporting data to the file before calling the URI?
The problem is that export runs as asynchronous task - result on the URL returned in payload of POST
to /gdc/exporter/executor
(in form of /gdc/exporter/result/{project-id}/{result-id}
) is available after exporter task finishes its job.
If the task has not been done yet, GET
to /gdc/exporter/result/{project-id}/{result-id}
should return status code 202
which means "we are still exporting, please wait".
So you should periodically poll on the result URL until it returns status 200
which will contain a payload (or 40x
/50x
if something wrong happened).