当前位置: 首页 > 工具软件 > graphql-api > 使用案例 >

graphQL的使用

季稳
2023-12-01

    最近一直使用graphQL开发接口,这个真的是很方便,再也不用给前端提供API文档啦。基础知识可以直接上官网https://graphql.cn/上学习一下即可。下面我记录一下,自己使用过程中觉得需要注意的细节。

1、每一个函数必须有输出,可以是对象、数组、字符、布尔值

2、输入参数中,若为必输参数,在参数后加!

3、GraphQL 支持的指令有两个:

         @include(if: Boolean) 仅在参数为true时,包含此字段。

         @skip(if: Boolean) 如果参数为true,跳过此字段。

但是可以自定义指令,例:

directive @auth(requires: String) on OBJECT | FIELD_DEFINITION
@Bean
public SchemaDirective authorisationDirective() {
    return new SchemaDirective("auth", new AuthorisationDirective());
}

4、自定义类型

scalar Date



@Bean
public GraphQLScalarType dateScalar() {
    return GraphQLScalarType.newScalar().name("Date").description(" Date 转换类").coercing(new Coercing<Date, String>() {
        @Override
        public String serialize(Object input) throws CoercingSerializeException {
            if (input instanceof Date) {
                return DateUtil.format((Date) input, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
            } else if (input instanceof String) {
                return (String) input;
            }
            throw new CoercingSerializeException(
                "Expected a 'String' or 'java.util.Date' but was '" + typeName(input) + "'."
            );
        }

        @Override
        public Date parseValue(Object input) throws CoercingParseValueException {
            Date date = null;
            if (input instanceof Date) {
                date = (Date) input;
            } else if (input instanceof String) {
                ReflectionUtils.convert(input, Date.class);
            } else {
                throw new CoercingParseValueException(
                    "Expected a 'String' or 'java.time.temporal.TemporalAccessor' but was '" + typeName(input) + "'."
                );
            }
            return date;
        }

        @Override
        public Date parseLiteral(Object input) throws CoercingParseLiteralException {
            if (!(input instanceof StringValue)) {
                throw new CoercingParseLiteralException(
                    "Expected AST type 'StringValue' but was '" + typeName(input) + "'."
                );
            }
            return ReflectionUtils.convert(input, Date.class);
        }

    }).build();
}

5、若函数返回值为数字、字符、布尔值时,测试函数接口时,不需要写返回值。

6、输入接口的参数可以与实体bean不一样,根据业务需求进行修改。

7、输出对象中的属性可以是方法,方法也可以传参数,只需要实现该方法即可。例:

#任务主表
type Issue {
    # 任务ID
    id: ID
    # 项目id(预留)
    project: IssueProject
    # 任务对应的当前操作
    operations(user: ID): [IssueOperation]

}

实现该方法

public List<IssueOperation> operations(Issue issue,Long user) {
    List<IssueWorkflowStepTransition> transitions =     this.issueWorkflowService.getWorkflowStepTransitions(issue,user);

    return transitions.stream().map(item -> IssueOperation.builder()
            .name(item.getName()).id(item.getId()).screen(item.getView()).grants(item.getGrants())
            .build()).collect(Collectors.toList());
}

 8、两个实体可以使用同一个输出对象(该对象包含两个bean的全部属性),输出时需要重写输出对象的属性。

 类似资料: