When using the Web.Contents function to call a web service in Power Query in either Power BI or Excel you may encounter the following error:
DataFormat.Error: Block length does not match with its complement.
Here’s an example of an M query that calls a web service and, at the time of writing, gives this error:
Web.Contents(
"https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&hourly=temperature_2m"
)
The problem is caused by something to do with how some web services handle “deflate” compression; apparently the same issue exists in the equivalent native .NET functionality. There are two ways to avoid it though.
First of all, the easy way: ask the web service to use “gzip” compression instead. You can do this by setting the “Accept-Encoding” header to “gzip” like so:
Web.Contents(
"https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&hourly=temperature_2m",
[
Headers = [
#"Accept-Encoding" = "gzip"
]
]
)
Having done this the error will no longer occur and you can go on to handle the data returned by the web service (which is a JSON document) as normal.
The second is to use the Web.BrowserContents function instead of Web.Contents:
Web.BrowserContents(
"https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&hourly=temperature_2m"
)
This is more complicated because the Web.BrowserContents function returns the HTML for a web page as viewed by a web browser. Apart from issues like handling authentication you’ll need to parse the result to get the data you need:
It’s doable using the Html.Table function though. Here’s an example of how to handle the response for this particular web service call:
let
Source = Web.BrowserContents(
"https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&hourly=temperature_2m"
),
HTMLTable = Html.Table(
Source,
{{"JSONPayload", "pre"}}
),
JSON = Json.Document(
HTMLTable{0}[JSONPayload]
)
in
JSON
[Thanks to Thais Marshall for bringing me this problem, and to Curt Hagenlocher for explaining and it showing me the first workaround]