Cómo obtener datos de un SOAP WS con Power BI

Un usuario Pregunto ✅

Manal

Hola,

Tengo una aplicación con un wb SOAP y quiero crear paneles usando Power BI Desktop.

¿Cómo obtengo datos usando SOAP wb?

Sé que Power BI tiene una API REST y dice que te ayuda a enviar datos al recurso power bi, pero en mi caso tengo un recurso externo al que tengo que conectarme.

Gracias por tu ayuda.

Atentamente.

Manal

maiconorlandobr

la gente me puede ayudar, no recibo ningún comentario, PBI lo considera como un mensaje de texto

sitio donde estoy tratando de obtener los datos de Web Service – Definição do Serviço de Exportação de Funcionários – obterFuncionarios – AHGORA SISTEM …


let
Source = Xml.Tables(Web.Contents("http://www.ahgora.com.br/ws/pontoweb.php?wsdl"
,[Content=Text.ToBinary("<soapenv:Envelope xmlns:soapenv="&Character.FromNumber(34)&"http://schemas.xmlsoap.org/soap/envelope/"&Character.FromNumber(34)&" xmlns:ws="&Character.FromNumber(34)&"http://www.ahgora.com.br/ws"&Character.FromNumber(34)&">
<soapenv:Header/>
<soapenv:Body>
<ws:obterFuncionarios>
<hash>15151531351313135131351313531531</hash>
<matricula>230</matricula>
</ws:obterFuncionarios>
</soapenv:Body>
</soapenv:Envelope>",
Headers=[#"Accept-Encoding"="gzip,deflate", #"Content-Type"="text/xml;charset=UTF-8"]])))
in
Source

Jonas1

He estado probando lo que recomiendas en este hilo durante bastante tiempo, pero obtengo «No se puede aprobar con las credenciales proporcionadas. Vuelve a intentarlo» cuando intento recuperar mi token de sesión. Mis credenciales se proporcionan en el archivo xml mientras que el tipo de conexión se ha establecido en anónimo, por lo que esto no debería tener sentido, ¿verdad?

Utilizo el siguiente código en la consulta:

let
    Source = Xml.Tables(Web.Contents("https://xxx.xxxxx.com/wsapi/services/authentication?WSDL",[Content=File.Contents("xxxxxxxxxxxxxx.xml"),
    Headers=[#"Accept-Encoding"="gzip,deflate", #"Content-Type"="text/xml;charset=UTF-8"]]))
in
    Source

Si bien el archivo xml es la solicitud de inicio de sesión para la API, solo devuelvo mi nombre de usuario y contraseña cuando importo el archivo a Power Bi de forma independiente:

image.png

¿Puedes ver algo mal que estoy haciendo? ¿Podrían @JasonL o @juliovidigal echar un vistazo rápido, por ejemplo?

juliovidigal

En respuesta a Jonas1

Buenas tardes.
¿No se puede hacer todo dentro de la M? ¿Para probar, en lugar de usar el archivo XML?

EX..

dejar

Fuente = Xml.Tables (Web.Contents («https://advertising.criteo.com/API/v201305/AdvertiserService.asmx?WSDL»

,[Content=Text.ToBinary(«<soapenv:Envelope xmlns=»&Character.FromNumber(34)&»https://advertising.criteo.com/API/v201305″&Character.FromNumber(34)&» xmlns:soapenv=»&Character.FromNumber(34)&»http://schemas.xmlsoap.org/soap/envelope/»&Character.FromNumber(34)&»>

<soapenv:Body>

<clientLogin>

<username>aaaaa@aaaa.com</username>

<password>aaaaaaaa</password>

</clientLogin>

</soapenv:Body>

</soapenv:Envelope>»),Headers=[#»Accept-Encoding»=»gzip,deflate», #»Content-Type»=»text/xml;charset=UTF-8″]]))

en

Fuente

Jonas1

En respuesta a juliovidigal

Gracias por responder @juliovidigal.

Sí, puedo intentar hacer eso. ¿Cuál es la lógica detrás Character.FromNumber (34)? ¿Es esto algo de su archivo XML, o tiene que usarlo en su M para que las URL funcionen?

juliovidigal

En respuesta a Jonas1

Dentro de Text.ToBinary desempeña el papel de «.
El mío funciona con esto, puedes usarlo … incluso porque es mucho mejor que usar la llamada dento de un archivo, todo está en el código.


Jonas1

En respuesta a juliovidigal

Intenté ejecutar la API en Postman para ver si podía haber algún problema con mi M, pero también obtengo el código de estado 401 allí, así que creo que son mis credenciales las que tienen algún problema. Intentaré ejecutarlo a través del proveedor de la API.

Gracias por su tiempo, aunque @juliovidigal, se asegurará de probarlo tan pronto como se resuelvan mis problemas de credibilidad.

Jonas1

En respuesta a Jonas1

Hola @juliovidigal,

Así que finalmente logré obtener el ID de sesión (token) en Postman, pero creo que será difícil hacerlo funcionar solo en Power BI. Lo que se vuelve desafiante es que en realidad requiere que me autentique dos veces cuando hago la llamada de identificación de sesión. Una vez en XML, pero también bajo autorización en Postman usando un nombre de usuario diferente (o en propiedades de solicitud si está más familiarizado con ReadyAPI).

Por lo que puedo ver, también debe aplicar la autorización básica en Power BI, lo que no está permitido cuando se usa Contenido en una expresión Web.Content … ¿Supongo que pudo crear una conexión anónima en Power BI?

Yggdrasill

Este hilo es muy útil.

Mi fuente de datos requiere mi IP y me da usuario y contraseña a cambio.

Este es mi código y devuelve datos y funciona.

let
SourceURL = "url of wsdl",

options = [ #"Authorization" ="Basic XXXX",
            #"Accept-Encoding"= "gzip,deflate",
           // SOAPAction="",
            #"Content-Type"="text/xml;charset=UTF-8",
            #"Connection"="Keep-Alive"
          ],
WebContent = Web.Contents(SourceURL, 
    [Content=Text.ToBinary("
    
    <soapenv:Envelope xmlns:soapenv=#(0022)http://schemas.xmlsoap.org/soap/envelope/#(0022) 
xmlns:v1=#(0022)Host URL#(0022)> <soapenv:Header/> <soapenv:Body> <v1:getAll> <!--Optional:--> <from>2018-10-10T00:00:00Z</from> <!--Optional:--> <to>2018-10-10T00:00:00Z</to> </v1:getAll> </soapenv:Body> </soapenv:Envelope> "), Headers=options]) , XmlContent = Xml.Tables(WebContent), Table = XmlContent{0}[Table], Table1 = Table{0}[Table], Table2 = Table1{0}[Table], Table3 = Table2{0}[Table], Table4 = Table3{0}[Table], in Table4

Estoy tratando de pasar un parámetro a los filtros de fecha en el texto xml.

¿Alguien tiene suerte con eso?

Yggdrasill

En respuesta a Yggdrasill

He editado mi código anterior para poder pasar parámetros al xml

El servicio SOAP me permite obtener un máximo de 31 días de datos. Así que creé un parámetro de fecha al que llamo StartingDate. Luego creé una lista de parámetros decimales que llamo Días

El formato de fecha se establece estrictamente como AAAA-MM-DD

Luego agrego este código antes de llamar al servicio

let
//parameters Date2 = Date.AddDays(Date.From(#"StartingDate"), #"Days"), Year = Text.From(Date.Year(#"StartingDate")), Month= Text.From( if Text.Length(Number.ToText(Date.Month(#"StartingDate"))) = 1 then Text.Combine({"0",Number.ToText(Date.Month(#"StartingDate"))}, "") else Date.Month(#"StartingDate") ), Day = Text.From( if Text.Length(Number.ToText(Date.Day(#"StartingDate"))) = 1 then Text.Combine({"0",Number.ToText(Date.Day(#"StartingDate"))}, "") else Date.Day(#"StartingDate") ), Year2 = Text.From(Date.Year(Date2)), Month2= Text.From( if Text.Length(Number.ToText(Date.Month(Date2))) = 1 then Text.Combine({"0",Number.ToText(Date.Month(Date2))}, "") else Date.Month(Date.AddDays(Date.From(Date2))) ), Day2 = Text.From( if Text.Length(Number.ToText(Date.Day(Date2))) = 1 then Text.Combine({"0",Number.ToText(Date.Day(Date2))}, "") else Date.Day(Date2) ), //Create Date filters DateFrom = Text.Combine({Year,Month,Day}, "-") , DateTo = Text.Combine({Year2,Month2,Day2}, "-") ,

Y luego, cuando llega al XML, simplemente hago esto

WebContent = Web.Contents (SourceURL, 
    [Content=Text.ToBinary("
    
    <soapenv:Envelope xmlns:soapenv=#(0022)http://schemas.xmlsoap.org/soap/envelope/#(0022) xmlns:v1=#(0022)XXXXXXXXXX#(0022)>
   <soapenv:Header/>
   <soapenv:Body>
      <v1:getAllLandings>
         <!--Optional:-->
         
         <from>"&DateFrom&"</from>
         <!--Optional:-->
         <to>"&DateTo&"</to>
      </v1:getAllLandings>
   </soapenv:Body>
</soapenv:Envelope>

"), 

Hope this helps 

Anonymous

After getting into it more and more I have to say its getting easier. I have been able to build functioning connectors on several SOAP webservices now thanks to the people in this thread, other threads and some hard trial and error.

 

Today I had a service that in a response gives only 100 records. You need to input:

 

– Mark (timestamp value from which timestamp onwards you want to receive)

 

The response gives:

 

– Data (100 records)

– Mark (Timestamp value)

– More (Whether more data is available)

 

The service will send the first 100 records that have never been seen before by me first if you use the correct mark. The correct mark is the mark used in the last response of the server. If you use the incorrect mark it will start sending all data never seen by me up untill the mark and all data after the mark regardless whether I have seen it or not.

 

I have been struggling all day to figure out a way to use the mark sent by the server in my next request and eval the more value in the response,

 

In below example, GetTraces(mark as text, customer as text, creds as text) is a function that collects a response from the server with a mark of a specific customer number, creds contains the basis authentication base encoded value,

 

This is what I came up with in the end to keep generating requests with the correct mark untill the more value is false:, may it help someone

 

a = List.Generate( () => [Page = GetTraces(mark, customer, creds)], cada [Page]{0}[more] <> "falso", cada uno [Page = GetTraces([Page]{0}[mark], cliente, creditos)]

Proceso la lista resultante en la tabla correcta en la GUI de Power BI y paso el código resultante en el código de mi conector.

Anónimo

Dejé de extraer SOAP a través de Power BI directamente. Ahora uso scripts de Python y cargo la salida de esos en Power BI. El problema que encontré fue la paginación.

La tabla de transacciones principal en mi fuente de jabón es de 1 millón de filas. Pero solo puedo solicitar 5000 registros de un mes o una semana de un año determinado al mismo tiempo. En Python es muy fácil hacer la variable de solicitud simplemente usando envoltorios SOAP disponibles en el repositorio de Python. No pude averiguar cómo hacerlo en Power BI.

En los Países Bajos, tenemos algunos servicios web muy populares utilizados por muchas pequeñas y medianas empresas, pero desafortunadamente algunas de las más grandes usan el SOAP heredado.

Anónimo

En respuesta a Anónimo

Hola, Es posible solucionar el problema de la pagenación con in power bi. Sin embargo, sugeriría usar R / python en su lugar, a menos que tenga que hacerlo solo en Power BI.

Anónimo

En respuesta a Anónimo

Creé una Idea en la sección Ideas para agregar un conector de servicio web con todas las funciones.

https: //ideas.powerbi.com/forums/265200-power-bi-ideas/suggestions/34017028-fully-featured-webservic …

Creo que esta es un área en la que Power BI puede mejorar. Debería ser más fácil conectarse a los servicios web y utilizar las funciones comunes que se utilizan en ellos.

Si está de acuerdo, vote por la idea 🙂

erickfranz

Yo uso esta consulta:

dejar
Fuente = Xml.Tables (Web.Contents («xxxxxxxxxxxx»
,[Content=File.Contents(«xxxxxxxpost.xml»),Headers=[Authorization=»Basic xxxxxxxxxxx» ,#»Accept-Encoding»=»gzip,deflate», #»Content-Type»=»text/xml;charset=UTF-8″]]))
en
Fuente

La autorización está bien. Mi post.xml es:





xx
xx


Lo intento en SOAPUI y está bien, pero el resultado en Power BI es diferente:

Captura.JPG

Creo que debe ser la dirección «urn»

Bulat

En respuesta a erickfranz

Tengo el mismo problema

con la consulta:

   let
    body="<soapenv:Envelope xmlns:soapenv=#(0022)http://schemas.xmlsoap.org/soap/envelope/#(0022) xmlns:csv=#(0022)http://www.csv.org#(0022)>
   <soapenv:Header/>
   <soapenv:Body>
        <csv:ReportTransactions>
         <csv:DateFrom>2020-01-01</csv:DateFrom>
         <csv:DateBy>2020-01-04</csv:DateBy>
         <csv:UNP>691759953</csv:UNP>
      </csv:ReportTransactions>
   </soapenv:Body>
</soapenv:Envelope>",

    Source = Xml.Tables(Web.Contents("http://XXXXX.1cws?wsdl",
    [Content=Text.ToBinary(body), 
    Headers =[
        #"Authorization" = "basic XXXX",
        #"Accept-Encoding"= "gzip,deflate",
        #"User-Agent"= "Apache-HttpClient/4.1.1 (java 1.5)",
        //#"Content-Length"="360",
        //SOAPAction="#(0022)http://www.csv.org#JI_WScsv:ReportTransactions_DD#(0022)",
        #"Content-Type"="application/soap+xml;charset=UTF-8;action=#(0022)http://www.csv.org#JI_WScsv:ReportTransactions_DD#(0022)",
        #"Connection"="Keep-Alive"]]))
in
    Source

funciona en SOAP UI

pero devuelve el resultado como si no se publicaran parámetros en el servicio. La expansión de estas tablas no da el resultado necesario

webservice_not_posted_parameters.jpg

encabezado de violinista después de la interfaz de usuario de SOAP (cuando SOAP da el resultado necesario)

fiddler_post_header.jpg

¿Alguien puede ayudar con eso?

Bulat

En respuesta a Bulat

He resuelto el problema

Necesitaba en la URL de WSDL – eliminar al final «? Wsdl»

let
    body="<soapenv:Envelope xmlns:soapenv=#(0022)http://schemas.xmlsoap.org/soap/envelope/#(0022) xmlns:csv=#(0022)http://www.csv.org#(0022)>
   <soapenv:Header/>
   <soapenv:Body>
        <csv:ReportTransactions>
         <csv:DateFrom>2020-01-01</csv:DateFrom>
         <csv:DateBy>2020-01-04</csv:DateBy>
         <csv:UNP>691759953</csv:UNP>
      </csv:ReportTransactions>
   </soapenv:Body>
</soapenv:Envelope>",

    Source = Xml.Tables(Web.Contents("http://XXXXXXXXXXX/ws/ws_csv.1cws",
   
   // NOT http://XXXXXXXXXXX/ws/ws_csv.1cws?wsdl - 
   // this ending ?WSDL stopped the recieving of the response!


   [Content=Text.ToBinary(body), 
	Headers =[
        #"Authorization" = "basic XXXXXXXXXX",
        #"Accept-Encoding"= "gzip,deflate",
        #"Content-Type"="text/xml;charset=UTF-8"
           ]])),
    Table = Source{1}[Table],
    Table1 = Table{0}[Table],
    Table2 = Table1{0}[Table]
in

Anónimo

En respuesta a Bulat

@ Jonas1

@juliovidigal

@Yggdrasill

@amitchandak

Hola a todos

Tengo problemas al acceder al WSDL SOAP basado en tokens en Power BI.

También cualquier otra forma de realizar esta tarea parte de Zapsys ODBC

Error

DataSource.Error: Web.Contents no pudo obtener el contenido de ‘https://sync.severa.com/webservice/S3/API.svc’ (500): Error interno del servidor
Detalles:
DataSourceKind = Web
DataSourcePath = https: //sync.severa.com/webservice/S3/API.svc
Url = https: //sync.severa.com/webservice/S3/API.svc

Editor avanzado de código

dejar

Fuente = Xml.Tables (Web.Contents («https: //sync.XXXXXX/S3/API.svc»
,[Content=File.Contents(«C:XXpost.xml»),Headers=[#»Accept-Encoding»=»gzip,deflate», #»Content-Type»=»text/xml;charset=UTF-8″]]))
en
Fuente

post.XML

Clave de token de API

2020-04-12T09: 00: 00

Bulat

En respuesta a Anónimo

¿Ha intentado obtener datos con SOAP UI o el software POSTMAN?

Si está bien, entonces recomiendo estar atento a los encabezados en el método POST.

Anónimo

En respuesta a Bulat

Sí, está funcionando en la interfaz de usuario de SOAP y he creado el xml y la consulta mencionados anteriormente siguiendo este hilo.

Bulat

En respuesta a Anónimo

Entonces debería funcionar.

Tuve un problema en algunas cosas imperceptibles, como el final de la cadena de conexión …

Además, no veo que en su XML use # (0022) en lugar de «. Vea mi ejemplo a continuación, puede que haya problemas.

cuerpo = «# (0022)http://schemas.xmlsoap.org/soap/envelope/# (0022)

Deja un comentario

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