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

Android中使用Apollo V3上传图片时遭遇‘validation’错误的解决咨询

Android中使用Apollo V3上传图片时遭遇‘validation’错误的解决咨询

看起来你在Apollo V3上传文件时踩了个典型的坑——错误地把文件对象序列化成JSON字符串传给了mutation,导致服务端无法正确识别Upload类型参数,触发了验证错误。让我帮你梳理问题并解决:

问题根源

你当前的代码里,用Gson().toJson(body)把文件对象转成了JSON字符串,然后传给UploadSecureTicketFileMutation。但GraphQL的Upload类型并不是普通的JSON字符串,它需要通过multipart/form-data格式来传输,Apollo V3有专门的机制处理这类请求,手动序列化JSON会完全打乱这个流程,服务端自然会抛出验证错误。

正确的解决步骤

1. 先确保添加了上传依赖

首先要在你的项目Module级别build.gradle里添加Apollo上传相关的依赖,没有这个依赖的话没法处理Upload类型:

implementation "com.apollographql.apollo3:apollo-upload:$apolloVersion"

把$apolloVersion替换成你实际使用的Apollo V3版本号,比如3.8.2。

2. 用Apollo的Upload类包装你的文件

不要手动序列化文件,而是用Apollo提供的Upload.Builder来构建符合要求的Upload对象:

// 假设你已经获取到了要上传的File对象
val targetFile = File("你的文件路径")

val upload = Upload.Builder()
    .filename(targetFile.name) // 设置文件名
    .contentType("image/jpeg") // 根据文件类型设置正确的Content-Type,比如png就是image/png
    .contentLength(targetFile.length()) // 文件大小
    .body(targetFile.inputStream()) // 文件输入流
    .build()

3. 正确调用Mutation

直接把构建好的Upload对象传给Mutation,不需要做任何JSON序列化:

lifecycleScope.launch {
    try {
        val response = apolloClient.mutation(UploadSecureTicketFileMutation(upload))
            .execute()
        if (response.hasErrors()) {
            Toast.makeText(
                this@TicketsActivity,
                response.errors?.get(0)?.message,
                Toast.LENGTH_SHORT
            ).show()
        } else {
            val uploadFile = response.data?.uploadSecureTicketFile
            Log.e("uploadFile", uploadFile.toString())
        }
    } catch (e: ApolloHttpException) {
        apolloError(e, this@TicketsActivity)
    }
}

额外说明

Apollo V3会自动识别Mutation中的Upload类型参数,将请求转换成标准的multipart/form-data格式发送给服务端,完全不需要你手动处理序列化和请求格式,这也是为什么你之前手动转JSON的方式会失败的核心原因。

备注:内容来源于stack exchange,提问作者Ali Salmanian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 12:39:32