Información de caducidad sobre AccessToken generada con PowerBI Rest API

Un usuario Pregunto ✅

insoluzioni

Hola,

Estoy tratando de importar automáticamente un archivo PBIX en mi área de trabajo con Power BI Embedded, actualmente usando el siguiente código, pero aparece el error:

HTTP Error 400. The request is badly formed.

Realmente no pude encontrar la sintaxis correcta para enviarlo a través de PHP cURL, actualmente usando esto:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://api.powerbi.com/v1.0/collections/$workspace_collection_name/workspaces/$workspace_id/imports?datasetDisplayName=$display_name&nameConflict=$nameConflict");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_POST, TRUE);
$boundary = "BOUNDARY";

$postdata = "--". $boundary . "rn";
$postdata .= "Content-Disposition: form-data;rn";
$postdata .= "rn";
$postdata .= "{".file_get_contents($file_path)."}";
$postdata .= "--".$boundary . "--rn";

curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  "Authorization: AppKey  $access_key",
  "Content-Type: multipart/form-data; boundary=$boundary"  
)); 

$response = curl_exec($ch);
curl_close($ch);
var_dump($response);

¿Alguien se daría cuenta de lo que estoy haciendo mal?

Gracias

insoluzioni

En respuesta a Eric_Zhang

¡Gracias por la respuesta @Eric_Zhang!

En realidad, el problema estaba en la variable DisplayName, que tenía espacios. Resolvió eso eliminando estos espacios, pero no sé si hay otra solución.

He trabajado duro para que esto funcione en PHP, pero resultó que había algunos pequeños detalles en la sintaxis de la solicitud HTTP. Estoy compartiendo mi solución a continuación para importar con éxito un archivo PBIX a su espacio de trabajo:

/**
 * Imports specified PBIX file to workspace collection
 *
 * @param string $file_path
 * @param string $file_name
 * @param string $display_name
 * @return void
 */

function importPBIX($file_path, $file_name, $display_name) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, "https://api.powerbi.com/v1.0/collections/".COLLECTION_NAME.
            "/workspaces/".WORKSPACE_ID."/imports?datasetDisplayName=$display_name");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    curl_setopt($ch, CURLOPT_POST, TRUE);
    $boundary = "BOUNDARY";
    $postdata = "--".$boundary . "rn";
    $postdata .= "Content-Disposition: form-data; name="" . $file_name . ""; filename="" . $file_name . ""rn";
    $postdata .= "Content-Type: application/octet-streamrnrn";
    $postdata .= file_get_contents($file_path);
    $postdata .= "rn";
    $postdata .= "--".$boundary . "--rn";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Content-Type: multipart/form-data; boundary="$boundary"",
        "Authorization: AppKey " . APP_KEY
    )); 
    curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );

    $response = curl_exec($ch);
    curl_close($ch);

    // Retorna o id do relatório importado
    $responseJson = json_decode($response, TRUE);
    $repoId = $responseJson['id'];

    // Retorna dados do relatório   
    return $repoId;
}

Preste atención a las constantes COLLECTION_NAME, WORKSPACE_ID Y APP_KEY que deben definirse previamente en este código.

¡Gracias!


@insoluzioni escribió:

Hola,

Estoy tratando de importar automáticamente un archivo PBIX en mi área de trabajo con Power BI Embedded, actualmente usando el siguiente código, pero aparece el error:

HTTP Error 400. The request is badly formed.

Realmente no pude encontrar la sintaxis correcta para enviarlo a través de PHP cURL, actualmente usando esto:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://api.powerbi.com/v1.0/collections/$workspace_collection_name/workspaces/$workspace_id/imports?datasetDisplayName=$display_name&nameConflict=$nameConflict");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_POST, TRUE);
$boundary = "BOUNDARY";

$postdata = "--". $boundary . "rn";
$postdata .= "Content-Disposition: form-data;rn";
$postdata .= "rn";
$postdata .= "{".file_get_contents($file_path)."}";
$postdata .= "--".$boundary . "--rn";

curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  "Authorization: AppKey  $access_key",
  "Content-Type: multipart/form-data; boundary=$boundary"  
)); 

$response = curl_exec($ch);
curl_close($ch);
var_dump($response);

¿Alguien se daría cuenta de lo que estoy haciendo mal?

Gracias


@insoluzioni

Creo que el error no muestra nada en PHP específico, indica que hay algo mal en la solicitud. No sé PHP, sin embargo, a continuación, la demostración de C # puede redactar una buena solicitud e importar un pbix a mi espacio de trabajo. Puede hacer referencia a la demostración y modificar la solicitud en PHP en consecuencia.

using System;
using System.Net;
using System.IO;
namespace PBIGettingStarted
{
    class Program
    {
        //Access key for app token
        private static string accessKey = "yourAccesskey";
        //Power BI app token values
        private static string workspaceCollectionName = "yourworkspacecollectioname";
        private static string workspaceId = "yourworkspaceid";
        private static string pbixFileName = "pbixname.pbix";
        static void Main(string[] args)
        {
            //Imports uri
            var uri = String.Format
("https://api.powerbi.com/v1.0/collections/{0}/workspaces/{1}/imports?datasetDisplayName=SampleImport",
workspaceCollectionName, workspaceId);
            //PBIX file to import
  
            string fileName = @"C:testkpi.pbix";

            //Create web request
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            //Import Request format:
            // Header:
            //  Content - Type: multipart / form - data; ----------BOUNDARY
            //  Authorization: AppToken
            // Body:
            //  ----------BOUNDARY
            //  Content - Disposition: form - data; filename = "{pbix file}.pbix"
            //  Content - Type: application / octet – stream

            //Define POST
            request.Method = "POST";
            request.UseDefaultCredentials = true;
            //Header
            // Boundary
            string boundary = "----------BOUNDARY";
            byte[] boundaryBytes = System.Text.Encoding.ASCII.GetBytes("rn--" + boundary + "rn");
            // Content - Type
            request.ContentType = "multipart/form-data; boundary=" + boundary;
            // Authorization - Use AppToken jwt for Authorization header
            request.Headers.Add("Authorization", String.Format("AppKey {0}", accessKey));
            //Body
            string bodyTemplate = "Content-Disposition: form-data; filename="{0}"rnContent-Type: application / octet - streamrnrn";
            string body = string.Format(bodyTemplate, fileName);
            byte[] bodyBytes = System.Text.Encoding.UTF8.GetBytes(body);
            //Get request stream 
            using (Stream rs = request.GetRequestStream())
            {
                rs.Write(boundaryBytes, 0, boundaryBytes.Length);
                rs.Write(bodyBytes, 0, bodyBytes.Length);
                using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                {
                    byte[] buffer = new byte[4096];
                    int bytesRead = 0;
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        rs.Write(buffer, 0, bytesRead);
                    }
                }
                byte[] trailer = System.Text.Encoding.ASCII.GetBytes("rn--" + boundary + "--rn");
                rs.Write(trailer, 0, trailer.Length);
            }
            //Get response
            using (HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse)
            {
                //If Import succeeds, StatusCode = Accepted 
                var responseStatusCode = response.StatusCode.ToString();
            }
        }
    }

}

insoluzioni

En respuesta a Eric_Zhang

¡Gracias por la respuesta @Eric_Zhang!

En realidad, el problema estaba en la variable DisplayName, que tenía espacios. Resolvió eso eliminando estos espacios, pero no sé si hay otra solución.

He trabajado duro para que esto funcione en PHP, pero resultó que había algunos pequeños detalles en la sintaxis de la solicitud HTTP. Estoy compartiendo mi solución a continuación para importar con éxito un archivo PBIX a su espacio de trabajo:

/**
 * Imports specified PBIX file to workspace collection
 *
 * @param string $file_path
 * @param string $file_name
 * @param string $display_name
 * @return void
 */

function importPBIX($file_path, $file_name, $display_name) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, "https://api.powerbi.com/v1.0/collections/".COLLECTION_NAME.
            "/workspaces/".WORKSPACE_ID."/imports?datasetDisplayName=$display_name");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    curl_setopt($ch, CURLOPT_POST, TRUE);
    $boundary = "BOUNDARY";
    $postdata = "--".$boundary . "rn";
    $postdata .= "Content-Disposition: form-data; name="" . $file_name . ""; filename="" . $file_name . ""rn";
    $postdata .= "Content-Type: application/octet-streamrnrn";
    $postdata .= file_get_contents($file_path);
    $postdata .= "rn";
    $postdata .= "--".$boundary . "--rn";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Content-Type: multipart/form-data; boundary="$boundary"",
        "Authorization: AppKey " . APP_KEY
    )); 
    curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );

    $response = curl_exec($ch);
    curl_close($ch);

    // Retorna o id do relatório importado
    $responseJson = json_decode($response, TRUE);
    $repoId = $responseJson['id'];

    // Retorna dados do relatório   
    return $repoId;
}

Preste atención a las constantes COLLECTION_NAME, WORKSPACE_ID Y APP_KEY que deben definirse previamente en este código.

¡Gracias!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *