首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AppSync为一个查询执行多个HTTP请求

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

Stack Overflow用户
提问于 2020-07-29 10:54:40
回答 1查看 1.1K关注 0票数 2

下面是我想用AWS AppSync解决的用例:

saved(username: String)

  • AppSync客户端发送GraphQL查询到HTTP端点,该端点返回一个项目列表:{"items": ["a", "b"] }

  • For (a,b) AppSync将查询发送到HTTP端点,该端点返回项目的详细信息。也就是说,{"images": ["1.jpg", "2.jpg"], "panoramas": ["1a.jpg"]}

  • This应该与一个响应相结合:{"saved": [{"images": ["1.jpg", "2.jpg"], "panoramas": ["1a.jpg"]}, {"images": ["11.jpg", "22.jpg"], "panoramas": ["1b.jpg"]}]}

模式:

代码语言:javascript
复制
type Query {
    saved(username: String!): [Detail]
}

type Detail {
    images: [String]
    panoramas: [String]
}

HTTP端点非常简单:

代码语言:javascript
复制
GET /users/$username/saved/
GET /details/$itemid/

我已经调查过管道解析器,但什么都不能用。此外,我试图将解析器直接附加到“细节”,这是不可能的。这里,我似乎对AppSync缺乏一些基本的理解。你能给我指出正确的方向吗?

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 16:09:26

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

像这样修改您的模式;

代码语言:javascript
复制
type Query {
  saved(username: String!): [Item]
   
type Item {
  items: String
  details: Details
}

type Details {
  images: [String]
  panorama: [String]
}

用于您的saved查询;

请求模板

代码语言:javascript
复制
{
  "version": "2018-05-29",
  "method": "GET",
  "resourcePath": "/users/$ctx.args.username/saved",
  "params":{
      "headers": {
          "Content-Type": "application/json"
      }
  }
}

因为您的API响应并不完全是AppSync所能识别的,所以我们必须做一些卫生工作。因此在响应模板中

代码语言:javascript
复制
#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

现在,您可以使用这样的details附加另一个HTTP解析器;

请求模板

代码语言:javascript
复制
{
  "version": "2018-05-29",
  "method": "GET",
  "resourcePath": "/details/$ctx.source.items",
  "params":{
      "headers": {
          "Content-Type": "application/json"
      }
  }
}

响应模板

代码语言:javascript
复制
#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

我测试了上面的代码,它给了我这个响应;

代码语言:javascript
复制
{
  "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),但我希望它至少能给你一些方向。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63152006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档