GraphQL是一种查询语言,它允许客户端定义查询的数据形式。在GraphQL中,通过Mutation可以实现对服务端资源进行创造、修改、删除等操作。对于需要动态参数的Mutation,我们需要对Mutation的输入类型进行定义,以达到传入参数的目的。
Mutation基础
Mutation和Query很像,它们都需要一个操作类型和一个操作名称。
mutation createTodo { createTodo(input: {title: "Sample Title", description: "Sample Description"}) { id title description } }
上面这个例子,Mutation操作的名称是"createTodo",操作类型是"mutation"。而且它传递了一个input类型作为参数,里面包括了title和description属性。
在服务端,定义一个mutation类似下面这样:
type Mutation { createTodo(input: CreateTodoInput!): Todo! }
动态参数传递
当我们需要更加灵活地传递参数,我们需要将input类型编程自定义的GraphQL类型,并且需要添加自己的字段定义。例如下面这个例子:
-- -------------------- ---- ------- ---- --------- - ------ ------- ------------ ------- ---------- -------- -------- ----- - ---- -------- - ----------------- ------------------ ----- - ----- --------------- - ---------- ---------- -展开代码
这个例子中,我们定义了TodoInput类型,用于描述一个Todo的详细信息。同时,我们还定义了Mutation操作,名称是"createTodo",并且输入参数CreateTodoInput包含了一个todoInput字段,它是由TodoInput类型定义的。
客户端可以这样请求:
mutation createTodo { createTodo(input: {todoInput: {title: "Sample Title", description: "Sample Description", completed: false, dueDate: "2021-05-07"}}) { id title description } }
我们可以看到,客户端通过传递CreateTodoInput类型来实现了对于动态参数的传递,而且传递的参数是一个对象。
动态参数的指导
上面的例子是一个简单的示例,但是在实际应用中,我们往往需要更加复杂的参数传递方式,例如分页、排序和过滤等操作,这些都需要我们进行合理的设计。
在定义动态参数时,我们需要考虑以下几个方面:
1. 参数名称
参数名称需要符合命名规范,能够清晰明了的表达参数的含义。如果需要传递多个参数,可以采用对象的形式进行传递,这样既清晰又能够避免参数命名冲突的问题。
2. 参数类型
参数类型需要定义清楚,在客户端和服务端之间需要保持一致。对于复杂的参数,可以定义为自定义的类型,这样方便进行参数的复用和维护。
3. 参数说明
参数说明应当清晰明了,对于必填项和可选项应当进行明确的说明。如果需要传递多个参数,可以对每个参数进行说明。
4. 参数限制
对于参数的限制应当明确,例如字符串长度、数据类型和数值范围等。避免非法数据的传递和处理,从而提高程序的健壮性和安全性。
示例代码
下面是一个复杂参数传递的示例:
-- -------------------- ---- ------- ---- --------- - ------ ------- ------------ ------- ---------- -------- -------- ----- --------- --------- - ---- -------- - ---- ------ --- - ---- ----- - ----------- ---- --------- --------- ------ ------------ - ---- -------- - ------- --- ----- ----- - ---- ---- - --- --- ------ ------- ------------ ------- ---------- -------- -------- ----- --------- --------- - ---- ----- - ------------ ---- ------ ------- ----- ---- ------- ------- ---------- ------- ---------- ------- -------- ---------------- ------ - ---- -------- - ----------------- ------------------ ----- - ----- ----------- - ------ ------- --------- --------------- ------ ------- - ---- -------------- - ------ --------- ------------ -- - ----- --------------- - ---------- ---------- -展开代码
这个示例中,我们定义了一个Todo类型和一个Todos类型,其中Todo包含了title、description、completed、dueDate、priority等字段。而且我们定义了一个CreateTodoInput类型,它的输入参数包含了一个todoInput字段,它类型是自定义的TodoInput类型。在创建Todo时,我们需要为它传递title、description、completed、dueDate、priority等动态参数。
对于查询Todo列表,我们定义了一个todos操作,它包含了分页、排序和过滤等参数。其中,filters参数是一个数组类型,包含了多个FilterInput类型的参数。
在使用Mutation操作时,我们可以这样请求:
-- -------------------- ---- ------- -------- ---------- - ----------------- - ---------- - ------ ------- ------- ------------ ------- ------------- ---------- ------ -------- ------------- --------- ---- - -- - -- ----- ----------- - -展开代码
结语
动态参数传递是GraphQL的一个重要特性,在应用开发中具有广泛的应用。在设计参数类型时,需要充分考虑应用的复杂度和灵活性,从而实现良好的可维护性和扩展性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67c41ad56e1fc40e36cf3ce6