如何配置 Appsync 以从 HTTP 端点检索数据以填充列表?
Posted
技术标签:
【中文标题】如何配置 Appsync 以从 HTTP 端点检索数据以填充列表?【英文标题】:How to configure Appsync to retrieve data from a HTTP endpoint to populate a list? 【发布时间】:2021-03-18 15:28:47 【问题描述】:我有两个 http 端点设置:
GET /users/userId
GET /users/userId/notes/noteId
GET 用户返回一个负载,其中包含多个noteId
s 的列表,可用于向 GET Note 端点发出多个请求。
我正在尝试将 Appsync 配置为能够在单个查询中获取所有这些数据,但我无法让列表填充对象。
架构:
type Query
getUser(userId: String!): User
getNote(userId: String!, noteId: String!): Note
type User
userId: ID!
firstName: String!
lastName: String!
notes: [Note]
type Note
noteId: ID!
noteText: String!
createdDatetime: Int!
我为每个端点设置了一个数据源,我有一个用于 getUser
和 getNote
的解析器 - 我还有一个用于 User.notes
的解析器,它与 getNote
相同。这些解析器具有以下响应映射:
#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
我的 GET Note 解析器(包括 User.note
字段解析器)端点如下所示:
"version": "2018-05-29",
"method": "GET",
"resourcePath": $util.toJson("/prod/users/$ctx.args.userId/notes/$ctx.args.noteId"),
"params":
"headers":
"Content-Type": "application/json",
我可以从日志中看到,Appsync 尝试运行 GET Note 解析器,但资源路径似乎没有填充任何 ID? (我可以在端点上的自定义 Authorizer 中看到这一点,它会注销仍然包含 $ctx.args...
的方法 ARN
感觉这是一个常见的用例,但我在任何地方都找不到解决方案或示例。我的方法是否正确,还是需要其他解决方案?
【问题讨论】:
请问你是怎么从getUser
打电话给getNote
的?
嗨@Myz,我错过了我的问题 - 我现在已经更新了。我有一个字段解析器,它指向与 getNote 解析器相同的映射。
【参考方案1】:
我认为第一个问题是您的User.notes
解析器以及您如何访问userId
和noteId
。当你有字段解析器时,你应该使用ctx.source
来访问父字段[Ref.]。例如,您应该在 User.notes
字段解析器中使用 ctx.source.userId
。
其次,当您要从您的 getNote
HTTP 端点获取单个注释时,AppSync 在使用 BatchInvoke
通过 AWS Lambda 代理时支持这种类型的行为。请参阅this 链接上的“高级用例:批处理”以获得更好的想法。另外,我认为这个 SO post 与您的用例相关。
另一种可能性是让另一个 HTTP 端点一次获取所有用户的笔记,但我不确定这是否适用于您的情况。
【讨论】:
感谢@Myz 的回答。我之前没有考虑过使用 Lambda 解析器,但我认为这是正确的方法。一个新的 HTTP 端点似乎违背了我使用 graphql(微服务与前端逻辑分离)的推理。以上是关于如何配置 Appsync 以从 HTTP 端点检索数据以填充列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Amplify 配置为使用多个 AppSync 端点?
如何在没有云端的情况下将 route53 放在 appsync 端点的前面?
如何将签名的 HTTP 请求从 AWS Lambda 发送到 AppSync GraphQL?