这感觉很基本,所以我希望找到提到的这种情况,但是我已经搜索了并且找不到与我的情况相匹配的示例。我有两个端点要结合使用(我正在使用HTTP数据源)。
班级:
{
id: string,
students: [
<studentID1>,
<studentID2>,
...
]
}
和学生:
{
id: String,
lastName: String
}
我想要的是一个看起来像这样的模式:
Student: {
id: ID!
lastName: String
}
Class: {
id: ID!,
studentDetails: [Student]
}
通过阅读,我知道我需要在Class.studentDetails上使用某种解析程序,该解析程序将返回学生对象的数组/列表。我看到的大多数示例都显示了根据班级ID(ctx.source.id)检索“学生”列表,但是在这种情况下不起作用。我需要给每个学生打电话1次,并传入学生ID(我无法按班级ID获取学生列表)。
有没有一种方法可以为Class / studentDetails编写一个解析器,该解析器循环遍历Class中的学生ID,并为每个学生的学生端点调用一个端点?
我在请求映射模板中正在考虑以下问题:
#set($studentDetails = [])
#foreach($student in $ctx.source.students)
#util.qr(list.add(...invoke web service to get student details...))
#end
$studentDetails
编辑:阅读下面Lisa Shon的评论后,我意识到用于DynamoDB数据源的批处理解析器可以执行此操作,但是我看不到对HTTP数据源执行此操作的方法。
答案 0 :(得分:0)
我向AWS Support开了一个案例,被告知他们唯一知道这样做的方法是创建一个Lambda Resolver:
答案 1 :(得分:0)
这并不理想,但是您可以创建一个中间类型。
type Student {
id: ID!
lastName: String
}
type Class {
id: ID!,
studentDetails: [StudentDetails]
}
type StudentDetails {
student: Student
}
在Class
的解析器模板中,创建这些学生ID的列表
#foreach ($student in $class.students)
$util.qr($studentDetails.add({"id": "$student.id"}))
#end
并将其添加到您的响应对象。然后,将解析器挂接到student
的{{1}}字段,然后您就可以对单个学生API调用使用StudentDetails
。每个$context.source.id
都会脱离数组,并且是它自己的Web请求。
答案 2 :(得分:0)
不要在响应中调用学生端点,而是使用管道解析器,并使用存储,上下文(上一步结果/结果)等从不同步骤拼接响应。