如何从 Power Query 正确查询这个基于 GraphQL 的 API?

问题描述 投票:0回答:1

如何重写损坏的查询?

我正在 Power Query 中编写一些 M 代码,其中有 GraphQL 部分提交给 API。目标是检索一些员工记录:ID、姓名和访问状态。现在我收到错误请求错误,据说是由于我的语法在查询中的某个时刻不正确。到目前为止,我使用的所有查询都是基于不同节点的模板查询。根节点如图 1 所示,我正在查询 WorkerAccess(其文档位于图 2 中)。直到我感兴趣的节点的其余分支如图 #3 所示。
在我基于模板创建的四个查询中,出于我的目的所需的唯一更改很小。我已经包含了下面的模板,并在可互换术语旁边添加了注释。据我所知,我不需要更改任何其他内容即可获得我需要的结果。但是,WorkerAccess 查询的参数与我使用过的其他查询有所不同,即它似乎需要一个工作人员 ID。这是每当我尝试调用时收到错误请求错误的可能原因之一。其他查询的参数中通常包含“First”和“After”。

let
  Source = (apiToken as text, optional endCursor as text, optional data as list) =>
    let
      endCursor = if endCursor is null then "" else endCursor,
      query = "{
        ""query"": ""
    {
      // Everything after 'results:' can be changed depending on the query
      results: PeopleOnSiteHistory(First: 2, After: \""" & endCursor &"\"") {
        PageInfo {
          HasNextPage
          EndCursor
        }
        Items {
          PersonId   // these items can be changed to reflect what I want back
          PersonName 
        }
      }
    }
    ""
    }",

      JSON = Web.Contents("https://cloud.3dsafety.com.au/graphql",
          [
              Headers = [#"X-API-Key"=apiToken, #"Content-Type"="application/json"],
              Content = Text.ToBinary(query)
          ]
      ),
      Source = Json.Document(JSON),
      pageInfo = Source[data][results][PageInfo],
      items = Source[data][results][Items],
      appendedData =
        if pageInfo[HasNextPage] = true and data is null then
          List.Combine({{}, items})
        else List.Combine({data, items}),
          output =
            if pageInfo[HasNextPage] = true then
              // Name of PQ query goes here after '@' sign
              @GetPeople(apiToken, pageInfo[EndCursor], appendedData)
            else
              // Items go in the curly braces again
              Table.FromList(appendedData, Record.FieldValues, {"PersonId", "PersonName"})
    in
      output
in
  Source

这是损坏的查询,显示了相关更改:

... "{
        ""query"": ""
    {
      results: WorkerAccess(Id: 1) {
        PageInfo {
          HasNextPage
          EndCursor
        }
        Items {
          Id
          Name
          AccessStatus
        }
      }
    }
    ""
    }",

      ...
              @GetWorkerStatus(apiToken, pageInfo[EndCursor], appendedData)
            else
              Table.FromList(appendedData, Record.FieldValues, {"Id", "Name", "AccessStatus"})
...
graphql powerquery m
1个回答
0
投票

不熟悉 Power Query,但看起来您试图在结果中返回不正确的结构。

WorkerAccess
查询采用一个参数:
Id
。它返回一个
WorkerProjectAccess
类型。

这将是来自客户端的有效 GraphQL 查询,它会返回类型树中所有可能的字段:

query myQuery($Id: ID!) {
  WorkerAccess(Id: $Id) {
    Id
    ProjectName
    NextAction 
    Sites {
      TotalCount
      PageInfo {
        HasNextPage
        EndCursor
      }
      Edges {
        Cursor
        Node {
          Id
          Name
          AccessStatus
        }
      }
      Items {
        Id
        Name
        AccessStatus
      }
    }
  }
}

而在您的情况下,您似乎在返回类型的根级别有

PageInfo
Items

© www.soinside.com 2019 - 2024. All rights reserved.