如何在单次GraphQL API调用中用查询结果作为Mutation输入ID?
解决方案
标准GraphQL规范本身不支持在单次请求中将查询的结果直接作为Mutation的输入参数,因为请求的变量在发起时就已确定,无法在执行过程中动态引用查询返回值。但很多GraphQL服务实现了扩展指令(比如@export)来支持这类场景,以下是具体实现方式:
使用@export指令(需服务端支持)
如果你的GraphQL服务支持@export指令(例如Hasura、Apollo Server的相关扩展),可以在同一个请求中先执行查询获取accountId,再将其导出为变量供后续Mutation使用:
请求体内容
query getClientList($input: ListInfoInput!) { getClientList(input: $input) { clients { accountId @export(as: "clientAccountId") } } } mutation createTicket($clientAccountId: String!, $input: CreateTicketInput!) { createTicket(input: { ...$input, client: { accountId: $clientAccountId } }) { ticketId subject ticketType source client } }
对应的变量(JSON)
{ "input": { "subject": "Test subject", "description": "This test description", "ticketType": "SERVICE_REQUEST", "source": "INTEGRATION" }, "input_getClientList": { "page": 1, "pageSize": 200, "condition": { "attribute": "name", "operator": "contains", "value": "ACME Inc" } } }
注意:不同服务对
@export的语法细节可能略有差异,比如变量命名规则(部分服务会要求为不同操作的变量添加前缀,如示例中的input_getClientList),请根据你的GraphQL服务文档调整。
若服务端不支持扩展指令
如果你的GraphQL服务没有提供这类扩展能力,单次POST请求无法完成该操作,因为标准GraphQL不允许跨操作的数据传递。这种情况下你只能分两次请求:先执行查询获取accountId,再发起Mutation请求。
内容的提问来源于stack exchange,提问作者Gerdofal
相关产品推荐
相关产品推荐

