[PowerQuery] Buena práctica para un web request

Habiendo intentado muchas veces de obtener los resultados de una dirección web mediante Power Bi me encontré con un increíble post del gran Chris Webb que narra como es que la documentación de microsoft pasa por alto las buenas prácticas de conexión url con Power Query.

No podíamos esperar que Power Bi haga todo por nosotros al simplemente clickear el conector y que toda la magia suceda. En este caso particular cuando usamos un conector Web para hacer un request http lo mejor que podremos hacer es modificar manualmente el código power query para lograr mejorar nuestro resultado y ayudar a Power Bi Service a reconocer el origen del dato.

Las consultas web pueden deberse a diversas circunstancias, ya sea buscar respuesta de una api o un sitio web. Lo cierto es que para éstas respuestas el motor utilizará una función llamada Web.Contents. Ésta función dispone de una serie de parámetros configurables que no son seteados por defecto por la herramienta. Dichos parámetros mejorarían los request y ayudarían a Power Bi Service a reconocer el origen del dato puesto que aveces puede fallar en esta tarea en largas y confusas URLs.

Consideremos la siguiente dirección web de la api gratuita de star wars.

https://swapi.dev/api/people/?search=Skywalker

Es un Get request a una API preguntando por la palabra "Skywalker" en el nombre de los personajes dentro del universo de star wars. Éste método daría una respuesta en formato JSON por cada personaje con dicho apellido.

Normalmente nuestro primer instinto sería usar el conector web y pegar la URL en Power Bi generando el siguiente código:

= Web.Contents(
        "https://swapi.dev/api/people/?search=Skywalker"
)

Sin embargo, en lugar de pegar una larga URL (que no es nuestro caso pero sirve para ejemplo) vamos a descomponerla en parámetros RelativePath y Query. Éstos forman parte del listado opcional de parámetros de la función según la documentación oficial. RelativePath se utiliza para especificar la ruta que va tomando la dirección web original, mientras que Query nos permitirá agregar los parámetros de la URL que aparecen seguidos de un signo "?" separados por "&". La separación es bastante sencilla. Nuestro código quedaría de la siguiente manera:

Web.Contents(
        "https://swapi.dev/api/",
        [
                RelativePath= "people/",
                Query=[
                        search= "Skywalker"
                ]
        ]
)

En caso que tengamos más de un parámetros especificado, nuestro Query tendría los valores entre [ ] separados por comas.

Éste método solo funcionará si la URL que separamos primero es válida por si misma. Es decir que "https://swapi.dev/api/" debe responder un código 200 y probablemente todo lo que siga después hará que la respuesta del dato sea diferente.

De éste modo, aunque hagamos requests a otros métodos de la api como planetas, Power Bi Service entendería que nuestro origen de datos pasa por una conexión anónima a "https://swapi.dev/api/".

Ésto ayuda no solo a construir URL más facilmente, sino también a tener un código más limpio y legible. 

Espero que esto los ayude a mejorar y limpiar sus llamados a web o incluso les permita actualizarlos en caso que estén teniendo una falla en las actualizaciones de datos web.