Joh*_*Doe 6 javascript graphql
我正在编写一个 GraphQL 服务器,想知道突变的响应应该是什么?对于查询来说,很明显:响应由所请求的内容组成。然而,对于突变,反应应该是什么或看起来是什么样子?响应是否应该仅包含一条字符串消息,让消费者知道突变是否成功且没有错误?或者反应应该是他们变异的物体?
GraphQL 不会强制这种方式或另一种方式,但流行的约定是返回对象。
对于 REST,通常的理解是,发生变化的对象应该作为对象所处的新状态返回。这种约定也延续到了 GraphQL,所以我想说在大多数情况下您希望返回该对象。
GraphQL 文档似乎也强化了这一点:
type Mutation {
createMessage(input: MessageInput): Message
updateMessage(id: ID!, input: MessageInput): Message
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下createMessage
,andupdateMessage
获取MessageInput
并返回更新的或新的Message
对象。
这也有重要的实际好处!对于像 Apollo 这样流行的 GraphQL 框架,返回结果意味着 Apollo 会自动将更新的结果集成到其缓存中,以便稍后更快地检索和渲染。
在某些情况下您不想这样做吗?确实。如果要删除对象,您可能只想返回更简单的返回类型,例如标识操作已完成的 ID 或字符串。
还有一些操作没有自然对象可返回,因为它们不直观地与 CRUD 操作相关联(promoteUser
例如)。在 REST 中,通常需要将操作包装到抽象对象(例如POST /promoteUserRequest
)中,以便在技术上符合习惯,但在 GraphQL 中,您可以更灵活(返回用户是有效的,或者仅返回字符串确认也是有效的) 。
还有其他信仰阵营也提倡这种设计:
type RootMutation {
createTodo(input: CreateTodoInput!): CreateTodoPayload
toggleTodoCompleted(input: ToggleTodoCompletedInput!): ToggleTodoCompletedPayload
updateTodoText(input: UpdateTodoTextInput!): UpdateTodoTextPayload
completeAllTodos(input: CompleteAllTodosInput!): CompleteAllTodosPayload
}
Run Code Online (Sandbox Code Playgroud)
在Apollo 博客的这个示例中,它不返回泛型Todo
类型,而是返回特定于每个突变的自定义类型。有些人认为这种突变-输入-响应的一对一映射是一种更好的方法,因为它可以让您编辑单个突变,而不必担心影响其他解析器的返回/输入值。有时这也用于查询。
最后,请记住这里的另一个 GraphQL 好处:无论您决定返回什么,客户端只需从结果中检索它(如果它有意义)。客户端可以自由地执行突变并请求全部、部分响应类型或不请求任何响应类型。相比之下,在 REST 下,您通常被迫接收整个响应。
总的来说,我想说返回对象更为常见,但没有硬性规则,因此您可以选择最适合您的 API 的规则。
归档时间: |
|
查看次数: |
1136 次 |
最近记录: |