求Netflix DGS GraphQL客户端Upload Mutation上传功能的实现示例
Netflix DGS Java客户端Upload Mutation实现示例
前置依赖配置
首先确保你的Spring项目中已引入DGS客户端starter依赖,版本建议和服务端DGS版本对齐:
<!-- Maven 依赖示例 --> <dependency> <groupId>com.netflix.graphql.dgs</groupId> <artifactId>graphql-dgs-client-starter</artifactId> <version>你使用的DGS版本号</version> </dependency>
核心实现步骤
- 确认服务端的Upload Mutation定义,参考示例如下:
type Mutation { uploadFile(file: Upload!, description: String): FileInfo }
- 构造客户端请求逻辑,直接用
DgsClient实例构建请求,传入MultipartFile类型的文件参数即可,DGS客户端底层会自动处理multipart/form-data的请求封装:
import com.netflix.graphql.dgs.client.MonoGraphQLClient; import org.springframework.web.multipart.MultipartFile; import reactor.core.publisher.Mono; import java.util.HashMap; import java.util.Map; import lombok.Data; @Component public class GraphqlUploadService { private final MonoGraphQLClient dgsGraphQLClient; // 构造注入DGS客户端,Spring会自动装配配置好的实例 public GraphqlUploadService(MonoGraphQLClient dgsGraphQLClient) { this.dgsGraphQLClient = dgsGraphQLClient; } public Mono<FileInfo> uploadFile(MultipartFile file, String description) { // 1. 构造GraphQL查询语句 String query = """ mutation uploadFile($file: Upload!, $description: String) { uploadFile(file: $file, description: $description) { id fileName fileSize url } } """; // 2. 组装变量,直接传入MultipartFile对象即可 Map<String, Object> variables = new HashMap<>(); variables.put("file", file); variables.put("description", description); // 3. 发起请求,解析返回结果 return dgsGraphQLClient.reactiveExecuteQuery(query, variables) .map(response -> response.extractValueAsObject("uploadFile", FileInfo.class)); } // 返回值映射实体类,和服务端返回字段对齐即可 @Data public static class FileInfo { private String id; private String fileName; private Long fileSize; private String url; } }
常见问题排查
- 确保你使用的DGS客户端版本在5.0.x以上,低版本对Upload的支持存在已知bug
- 不要手动修改请求的Content-Type,DGS客户端会自动识别文件参数并设置为
multipart/form-data - 如果有多个文件上传需求,直接传入
List<MultipartFile>类型参数即可,变量定义对应为[Upload!]!类型
内容的提问来源于stack exchange,提问作者Y_K
相关产品推荐
相关产品推荐

