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
相关产品推荐
相关产品推荐

