读取\修改图形

时间:2018-12-19 12:32:43

标签: python-2.7 graphql

我希望能够检查,验证和修改一些现有的graphql语句。例如,我使用模板生成以下内容,并从Elasticsearch获取数据

Sub PageBr()

  Const cStrName As String = "HPBr"
  Const cStrRange As String = "B50:B250"
  Dim nmAddress As String
  Dim i As Integer
  Dim j As Integer

  With Sheet1

    ' Define a name (Refers to ThisWorkbook (.Parent)).
    .Parent.Names.Add cStrName, .Range("B50:B250")
    nmAddress = .Parent.Names(cStrName).RefersToRange.Address

    ' Add horizontal pagebreaks.
    With .HPageBreaks
      .Add Before:=.Parent.Range("A59")
      .Add Before:=.Parent.Range("B159")
      .Add Before:=.Parent.Range("A248")
      .Add Before:=.Parent.Range("D269")
    End With

    ' Range version
    For i = 1 To .HPageBreaks.Count
      If Not Intersect(.Range(.HPageBreaks(i).Location.Address) _
          .Resize(, .Columns.Count), .Range(nmAddress)) Is Nothing Then
        j = j + 1
      End If
    Next
    Debug.Print "The named range '" & cStrName & "' contains " & j _
        & " horizontal pagebreaks."

    ' Row version
    Dim pbRow As Long
    Dim nmRow1 As Long
    Dim nmRow2 As Long

    nmRow1 = .Range(nmAddress).Row
    nmRow2 = .Range(nmAddress).Rows.Count + .Range(nmAddress).Row - 1

    j = 0
    For i = 1 To .HPageBreaks.Count
      pbRow = .Range(.HPageBreaks(i).Location.Address).Row
      If pbRow >= nmRow1 And pbRow <= nmRow2 - 1 Then
        j = j + 1
      End If
    Next
    Debug.Print "The named range '" & cStrName & "' contains " & j _
        & " horizontal pagebreaks."

  End With

End Sub

由此,我想做的就是检查id的值,例如访问该值

mutation.productUpdate.input.id

我只发布给第三方,不托管架构或类似内容。

要能够访问和修改有效负载,我需要使用库吗?如果是这样,那么最轻便的是什么?

谢谢

1 个答案:

答案 0 :(得分:0)

您控制此查询吗?像这样直接在查询中嵌入值通常不是最佳实践。相反,您可以使用GraphQL variables来使键值与查询本身分开传递。

mutation ProductUpdate($id: ID!, $tags: [String!]) {
  productUpdate(input: {id: $id, tags: $tags}) {
    product { id tags }
    userErrors { field message }
  }
}

如果您详细地分解GraphQL规范,则它包含几个主要部分:对象模型;解析GraphQL模式和查询的语法;确保查询与模式匹配的验证规则;对规则实际运行查询的执行规则;和HTTP传输部分(规范中仅此一种)。通常,我所见过的GraphQL库(用几种语言)将所有这些都结合在一起,但是高级用户可以分开。

使用相当成熟的GraphQL库,任何语言都可能实现您正在描述的内容,但是它不会具有非常方便的语法。摘要,您需要:

  1. 从服务中获取模式(有一个标准的GraphQL查询可以检索它,许多库都可以接受该JSON形式作为输入)。

  2. 使用您选择的库将建议的查询解析为抽象语法树(AST)。

  3. 找到您对AST结构感兴趣的值;修改它,如果那是您要尝试的并且允许的话。

  4. 使用GraphQL库针对AST验证查询。

  5. 将AST序列化回GraphQL查询。

  6. 以通常的方式将查询提交到服务器。

如果您不控制查询,那么我最初描述的变量方案可能会造成一些麻烦。您可能会发现(例如在我的示例查询中)字段的值是变量引用。您可以重写它,但it's a validation error to have unused variables可以重写,因此您可能也不得不(也许)删除变量,这会变得很麻烦。