API панели экспорта GoodData

Я работаю над тем, как экспортировать панель управления из определенного проекта, например ссылка.

Код, который я сделал, правильно генерирует ссылку для загрузки, как и ожидалось. Но экспортированный файл PDF не содержит отфильтрованных значений, как я хотел.

Моя проблема возникает под этим комментарием:

// Execute the dashboard with context

... где я полагаю установить «все фильтры, влияющие на панель инструментов», как указано в ссылке выше. Но он не указывает, как я могу установить значение фильтра.

Я сделал весь код на PHP (замените все "{some-thing}", чтобы этот код работал):

<?php 

    $login = '{email}';
    $pass = '{password}';

    $headers = array('accept' => 'Accept: application/json','content-type' => 'Content-Type: application/json; charset=utf-8');
    $data = json_encode(array('postUserLogin'=>array('login'=> $login,'password'=> $pass,'remember'=>0)));

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);     
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_URL, "https://secure.gooddata.com/gdc/account/login");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $output = curl_exec($ch); 
    $AuthSST =  substr($output, strrpos($output, "GDCAuthSST=")+strlen("GDCAuthSST="), 17);

    $headers = array('accept' => 'Accept: application/json',
                    'content-type' => 'Content-Type: application/json; charset=utf-8', 
                    'cookie:' => 'Cookie: $Version=0; GDCAuthSST='.$AuthSST.' $Path=/gdc/account');

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_HTTPGET, 1);
    curl_setopt($ch, CURLOPT_URL, "https://secure.gooddata.com/gdc/account/token");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $output = curl_exec($ch);         

    $start = strrpos($output, "GDCAuthTT=")+strlen("GDCAuthTT=");
    $finish = strrpos($output, "Path=/gdc");

    $GDCAuthTT =  substr($output, $start, ($finish-$start));

    $headers = array('accept' => 'Accept: application/json',
                    'content-type' => 'Content-Type: application/json; charset=utf-8', 
                    'cookie:' => 'Cookie: $Version=0; GDCAuthTT='.$GDCAuthTT.' $Path=/gdc/account');

    // Authentication finished, now start the dashboard export API

    // Execute the dashboard with context

    $project_id = '{project_id}';
    $filter_id = '{filter_id}';
    $filter_obj = '{0000}';
    $dash_obj = '{0000}';
    $url = 'https://secure.gooddata.com/gdc/internal/projects/'.$project_id.'/executionContexts';

    //  Inside filters: constraint, promptUri, uri, id ||||||||| Inside executionContext: dashboard, links, name, type, user

    $bode = json_encode(array('executionContext' => array('filters' => array(array(
                            'uri' => '/gdc/md/'.$project_id.'/obj/'.$filter_obj, // /elements?id=0000
                            'id' => $filter_id)), 
                            'dashboard' => '/gdc/md/'.$project_id.'/obj/'.$dash_obj,
                            'type' => 'export'
                        )));

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $bode);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $output = curl_exec($ch);

    // Export the Dashboard

    $dash_tab = 'ae2b1ab3a87c';

    $start = strrpos($output, "\"uri\":\"")+7;
    $finish = strrpos($output, "\"}");

    $url = "https://secure.gooddata.com/gdc/projects/".$project_id."/clientexport";

    $request_url = "https://secure.gooddata.com/dashboard.html#";
    $project = "project=/gdc/projects/".$project_id;
    $dashboard = "&dashboard=/gdc/md/".$project_id."/obj/".$dash_obj;
    $tab = "&tab=".$dash_tab."&export=1";
    $ctx = "&ctx=".substr($output, $start, ($finish-$start));

    $bode2 = json_encode(array('clientExport'=>array('url'=>$request_url.$project.$dashboard.$tab.$ctx, 'name'=>'{Dash_Name}')));

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $bode2);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $output = curl_exec($ch);

    // Poll the URL from response Result:

    $start = strrpos($output, "\"poll\":\"")+8;
    $finish = strrpos($output, "\"}");
    $poll = "https://secure.gooddata.com".substr($output, $start, ($finish-$start));

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_HTTPGET, 1);
    curl_setopt($ch, CURLOPT_URL, $poll);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);

    $output = curl_exec($ch);

    echo "Link: ".$poll;
    echo "<br>Output: ".$output;

    // Wait 90 seconds and then make the download, otherwise it returns 202 http code

    sleep(90);

    $opts = array('http' =>
      array(
        'method'  => 'GET',
        'header'  => "Accept: application/json\r\n".
            "Content-Type: application/json; charset=utf-8\r\n".
          'Cookie: $Version=0; GDCAuthTT='.$GDCAuthTT.' $Path=/gdc/account'."\r\n",
        'timeout' => 6000
      )
    );

    $context  = stream_context_create($opts);
    $file = file_get_contents($poll."?download=true", false, $context);
    file_put_contents("Dashboard.pdf", $file);

    echo "<br><br>Link used: ".$poll."?download=true";

    $errors= error_get_last();
    echo "<br><br>".$errors['type'];
    echo "<br>".$errors['message'];

    curl_close($ch);
?>

person Álvaro Prataviera Filho    schedule 27.06.2016    source источник
comment
Пожалуйста, не используйте хаки, такие как $AuthSST = substr($output, strrpos($output, "GDCAuthSST=")+strlen("GDCAuthSST="), 17); Мы можем изменить длину файла cookie GDCAuthSST в любое время (на самом деле мы собираемся сделать это в ближайшее время). Либо правильно обрабатывайте файлы cookie, либо используйте аутентификацию на основе заголовков (т. е. используйте уровень проверки 2) — см. [developer.gooddata.com/api#/reference/authentication](API doc) для получения более подробной информации.   -  person Martin Matula    schedule 29.06.2016
comment
Вау, спасибо! я так и сделаю ^^   -  person Álvaro Prataviera Filho    schedule 18.08.2016


Ответы (1)


Вы можете указать значения фильтра, используя объект constraint в определении фильтра. Точный формат ограничения зависит от типа фильтра. Если фильтр имеет тип list, формат ограничения:

"constraint": {
    "type": "list",
    "elements": [
      "/gdc/md/{project_id}/obj/{attribute_id}?id={element_id}",
      ...
    ]
}

если это фильтр даты, ограничение выглядит так:

"constraint": {
    "from": "2006-07-01",
    "to": "2008-03-31",
    "type": "interval"
}

or

"constraint": {
  "from": -5,
  "to": 0,
  "type": "floating"
}

Пример всего объекта executionContext для POST с одним фильтром list с 2 выбранными значениями:

{
  "executionContext": {
    "filters": [
      {
        "uri": "/gdc/md/{project_id}/obj/{attribute_id}",
        "constraint": {
          "type": "list",
          "elements": [
            "/gdc/md/{project_id}/obj/{displayForm_id}/elements?id={element_id_1}",
            "/gdc/md/{project_id}/obj/{displayForm_id}/elements?id={element_id_2}"
          ]
        },
        "id": "{filter_id}"
      }
    ],
    "dashboard": "/gdc/md/{project_id}/obj/{dashboard_id}",
    "type": "export"
  }
}

Вы можете увидеть действительный пример ограничения фильтра, например. в документации по упражнениям или создание сохраненного представления.

person akloboucnik    schedule 28.06.2016
comment
@ Альваро хорошо - поэтому, пожалуйста, отметьте ответ как правильный, чтобы другие знали - person akloboucnik; 29.06.2016