You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带请求头与变量的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:57:35