带请求头与变量的Spring Boot + GraphQL API(查询+变更)测试方案
现代GraphQL API完整实现方案(适配当前技术栈)
针对测试现代GraphQL API时遇到的市面教程多使用过时Resolver、缺乏符合当前技术栈实践的问题,整理了这套基于Spring GraphQL的完整实现方案:
GraphQL Schema定义(含GraphiQL注释、自定义标量)
scalar DateTime type Query { """ *在此添加接口注释* """ getCommunicationInteraction(id: String, number: String, callId: String): CommunicationInteraction } type Mutation { createCommunicationInteraction(communicationInteraction: CommunicationInteractionInput): CreateCommunicationInteractionResponse } type CommunicationInteraction { id: String number: String channel: String status: String interactionClass: String typeValue: String createDate: DateTime emailSenderAddress: String callId: String ownerLogin: String userNick: String parentServiceRequestId: String contactId: String contractId: String productId: String customerIdentification: CustomerIdentification } input CommunicationInteractionInput { id: String number: String channel: String status: String interactionClass: String typeValue: String createDate: DateTime emailSenderAddress: String callId: String ownerLogin: String userNick: String parentServiceRequestId: String contactId: String contractId: String productId: String customerIdentification: CustomerIdentificationInput } type CustomerIdentification { msisdn: String accountNum: String agreementNum: String partyId: String terminalDeviceId: String clientBase: String } input CustomerIdentificationInput { msisdn: String accountNum: String agreementNum: String partyId: String terminalDeviceId: String clientBase: String } type CreateCommunicationInteractionResponse{ id: String number: String }
带请求头校验的Controller实现
@Controller @Validated @AllArgsConstructor public class CommunicationInteractionGraphQLController { private final String HEADER = "x-channel-id"; private final HttpServletRequest request; @QueryMapping CommunicationInteraction getCommunicationInteraction( @Argument String id, @Argument String number, @Argument String callId ) { String header = request.getHeader(HEADER); if(!StringUtils.hasText(header)){ throw new NoContentException("未传入请求头\"x-channel-id\""); } return getCommunicationInteractionService.getCommunicationInteraction(id, number, callId).orElseThrow( () -> new NoContentException("根据传入参数未找到对应的CommunicationInteraction")); } @MutationMapping public CreateCommunicationInteractionResponse createCommunicationInteraction(@Argument CommunicationInteractionInput communicationInteraction){ String header = request.getHeader(HEADER); if(!StringUtils.hasText(header)){ throw new NoContentException("未传入请求头\"x-channel-id\""); } return createCommunicationInteractionService.createCommunicationInteraction(communicationInteraction, header); } }
注:代码中@AllArgsRequired应为@AllArgsConstructor(Lombok注解),hasText需引入org.springframework.util.StringUtils.hasText;Mutation方法入参修正为CommunicationInteractionInput,与Schema定义匹配
相关依赖配置(pom.xml)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.graphql</groupId> <artifactId>spring-graphql-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-graphql</artifactId> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java-extended-scalars</artifactId> <version>${graphql-java-extended-scalars.version}</version> </dependency>
自定义标量配置类
@Configuration public class ScalarConfiguration { @Bean public RuntimeWiringConfigurer runtimeWiringConfigurer() { return wiringBuilder -> wiringBuilder.scalar(ExtendedScalars.DateTime); } }
内容的提问来源于stack exchange,提问作者Nik Korn
相关产品推荐
相关产品推荐

