PowerBI Query WebMethod.Post возвращает Expression.Error: Мы не можем преобразовать значение «POST» в тип Function - PullRequest
0 голосов
/ 11 ноября 2019

Я использую веб-сайт, для которого требуется , чтобы их ключ API И данные запроса были отправлены с использованием метода Webform.Post. Я могу заставить это работать в Python, C # и даже могу создать и выполнить команду cURL, которая возвращает пригодный для использования файл JSON, который Excel может анализировать. Я также использую Postman для проверки моих параметров, и все выглядит хорошо, используя все эти методы. Однако моя цель - создать форму запроса, которую я могу использовать в Excel, но я не могу обойти этот синтаксис запроса в PowerBi Query.

Пока я делаю простой запрос. Этот запрос выглядит так:

let
    url_1 = "https://api.[SomeWebSite].com/api/v1.0/search/keyword?apiKey=blah-blah-blah",

    Body_1 = {
            
            "SearchByKeywordRequest: 
            
            {
                ""keyword"": ""Hex Nuts"",
                ""records"": 0,
                ""startingRecord"": 0,
                ""searchOptions"": Null.Type,
                ""searchWithYourSignUpLanguage"": Null.Type
            }"
            
             },
    
    Source = WebMethod.Post(url_1,Body_1)
    
in
    Source

ScreenSnip, показывающий действительный синтаксис

Генерирует следующую ошибку:

Expression.Error: We cannot convert the value "POST" to type Function.
Details:
    Value=POST
    Type=[Type]

ScreenSnipошибки, как это появляется в PowerQuery Advanced Editor

Большую часть последних двух дней я провел, пытаясь найти какой-либо пример с использованием этого метода или документации. В простой документации Microsoft говорится следующее:

WebMethod.Post
04/15/2018
2 minutes to read

About
Specifies the POST method for HTTP.

https://docs.microsoft.com/en-us/powerquery-m/webmethod-post

Это не поможет, и единственные посты, которые я нашел до сих пор, критикуют плакат за то, что он не использовал GET и POST. Я бы сделал это, но это НЕ поддерживается веб-сайтом, который я использую. Если кто-то может просто указать мне документ, в котором объясняется, что я делаю неправильно, или предложить решение, я был бы признателен.

1 Ответ

0 голосов
/ 11 ноября 2019

WebMethod.Post не является функцией. Это постоянное текстовое значение «POST». Вы можете отправить POST-запрос с помощью функции Web.Contents или WebAction.Request.

Простой пример, который отправляет JSON и получает JSON:

let
    url = "https://example.com/api/v1.0/some-resource-path",
    headers = [#"Content-Type" = "application/json"],
    body = Json.FromValue([Foo = 123]),
    source = Json.Document(Web.Contents(url, [Headers = headers, Content = body])),
    ...

Добавлено 14 ноября, 19

Тело запроса должно быть двоичного типа и включено в качестве поля Content второго параметра функции Web.Contents.

Вы можете создать двоичное значение JSON с помощью функции Json.FromValue. И наоборот, вы можете преобразовать двоичное значение JSON в соответствующий тип M, используя функцию Json.Document.

Примечание {} - это список типа на языке M, который похож на массив JSON. [] имеет тип record , аналогичный объекту JSON.

С учетом сказанного ваш запрос должен выглядеть примерно так:

let
    url_1 = "https://api.[SomeWebSite].com/api/v1.0/search/keyword?apiKey=blah-blah-blah",

    Body_1 = Json.FromValue([
        SearchByKeywordRequest = [
            keyword = "Hex Nuts",
            records = 0,
            startingRecord = 0,
            searchOptions = null,
            searchWithYourSignUpLanguage = null
        ]
    ]),

    headers = [#"Content-Type" = "application/json"],

    source = Json.Document(Web.Contents(url_1, [Headers = headers, Content = Body_1])),

    ...
Ссылки:
...