Graphql AppSync为一个查询执行多个HTTP请求

Graphql AppSync为一个查询执行多个HTTP请求,graphql,aws-appsync,Graphql,Aws Appsync,我想用AWS AppSync解决以下用例: 客户端发送GraphQL查询已保存(用户名:字符串) AppSync将查询发送到HTTP端点,该端点返回项目列表:{“items”:[“a”,“b”]} 对于这些项(a、b)中的每一项,AppSync都会向HTTP端点发送一个查询,该端点将返回这些项的详细信息。例如,{“图像”:[“1.jpg”,“2.jpg”],“全景”:[“1a.jpg”]} 这应该结合到一个响应中:{“saved”:[{“images”:[“1.jpg”、“2.jpg”],“pa

我想用AWS AppSync解决以下用例:

  • 客户端发送GraphQL查询
    已保存(用户名:字符串)
  • AppSync将查询发送到HTTP端点,该端点返回项目列表:
    {“items”:[“a”,“b”]}
  • 对于这些项(a、b)中的每一项,AppSync都会向HTTP端点发送一个查询,该端点将返回这些项的详细信息。例如,
    {“图像”:[“1.jpg”,“2.jpg”],“全景”:[“1a.jpg”]}
  • 这应该结合到一个响应中:
    {“saved”:[{“images”:[“1.jpg”、“2.jpg”],“panoramas”:[“1a.jpg”]},{“images”:[“11.jpg”、“22.jpg”],“panoramas”:[“1b.jpg”]}
  • 模式:

    type Query {
        saved(username: String!): [Detail]
    }
    
    type Detail {
        images: [String]
        panoramas: [String]
    }
    
    
    HTTP点相当简单:

    GET /users/$username/saved/
    GET /details/$itemid/
    
    我已经研究过管道解析器,但无法使任何东西正常工作。此外,我还尝试将解析器直接附加到“细节”上,这是不可能的。 似乎我对AppSync缺乏一些基本的了解。
    你能给我指出正确的方向吗?

    所以,我做了一些进一步的实验和测试,这是我最近的一次

    像这样修改你的模式

    type Query {
      saved(username: String!): [Item]
       
    type Item {
      items: String
      details: Details
    }
    
    type Details {
      images: [String]
      panorama: [String]
    }
    
    用于您的
    保存的
    查询

    请求模板

    {
      "version": "2018-05-29",
      "method": "GET",
      "resourcePath": "/users/$ctx.args.username/saved",
      "params":{
          "headers": {
              "Content-Type": "application/json"
          }
      }
    }
    
    {
      "version": "2018-05-29",
      "method": "GET",
      "resourcePath": "/details/$ctx.source.items",
      "params":{
          "headers": {
              "Content-Type": "application/json"
          }
      }
    }
    
    由于您的API响应不完全是AppSync能够识别的,所以我们必须做一些改进。因此,在响应模板中

    #if($ctx.error)
      $util.error($ctx.error.message, $ctx.error.type)
    #end
    #if($ctx.result.statusCode == 200)
        #set($itemList = [])
        #set($items = $util.parseJson($ctx.result.body).items)
        #foreach($item in $items)
          #set($itemJson = {})
          $util.qr($itemJson.put("items", $item))
          $util.qr($itemList.add($itemJson))
        #end
        #return($itemList)
    #else
        $utils.appendError($ctx.result.body, "$ctx.result.statusCode")
    #end
    
    #if($ctx.error)
      $util.error($ctx.error.message, $ctx.error.type)
    #end
    #if($ctx.result.statusCode == 200)
        $ctx.result.body
    #else
        $utils.appendError($ctx.result.body, "$ctx.result.statusCode")
    #end
    
    现在,您可以像这样附加另一个带有
    详细信息的HTTP解析器

    type Query {
      saved(username: String!): [Item]
       
    type Item {
      items: String
      details: Details
    }
    
    type Details {
      images: [String]
      panorama: [String]
    }
    
    请求模板

    {
      "version": "2018-05-29",
      "method": "GET",
      "resourcePath": "/users/$ctx.args.username/saved",
      "params":{
          "headers": {
              "Content-Type": "application/json"
          }
      }
    }
    
    {
      "version": "2018-05-29",
      "method": "GET",
      "resourcePath": "/details/$ctx.source.items",
      "params":{
          "headers": {
              "Content-Type": "application/json"
          }
      }
    }
    
    响应模板

    #if($ctx.error)
      $util.error($ctx.error.message, $ctx.error.type)
    #end
    #if($ctx.result.statusCode == 200)
        #set($itemList = [])
        #set($items = $util.parseJson($ctx.result.body).items)
        #foreach($item in $items)
          #set($itemJson = {})
          $util.qr($itemJson.put("items", $item))
          $util.qr($itemList.add($itemJson))
        #end
        #return($itemList)
    #else
        $utils.appendError($ctx.result.body, "$ctx.result.statusCode")
    #end
    
    #if($ctx.error)
      $util.error($ctx.error.message, $ctx.error.type)
    #end
    #if($ctx.result.statusCode == 200)
        $ctx.result.body
    #else
        $utils.appendError($ctx.result.body, "$ctx.result.statusCode")
    #end
    
    我测试了上面的代码,它给了我这个响应

    {
      "data": {
        "saved": [
          {
            "items": "a",
            "details": {
              "images": [
                "1.jpg",
                "2.jpg"
              ],
              "panoramas": [
                "1a.jpg"
              ]
            }
          },
          {
            "items": "b",
            "details": {
              "images": [
                "11.jpg",
                "22.jpg"
              ],
              "panoramas": [
                "1b.jpg"
              ]
            }
          }
        ]
      }
    }
    

    我希望这会对您有所帮助,并且可能不会完全满足您在问题中提出的要求(特别是您的要求4),但我希望它至少能为您提供一些指导。

    我担心有人会这么说。如果我能将项目的完整列表发送到详细信息界面(即
    POST/details--data{“id”:[“a”、“b”、“c”]}
    ),会有什么不同吗?对不起,我没有正确理解这个问题。我已经更新了我的答案,希望能有所帮助。