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!
Eric_Zhang
@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!