首页
/ Apollo Kotlin 中如何正确处理 GraphQL 错误响应

Apollo Kotlin 中如何正确处理 GraphQL 错误响应

2025-06-18 06:23:23作者:余洋婵Anita

在移动端开发中,与 GraphQL 服务器交互时正确处理错误响应是至关重要的。本文将深入探讨使用 Apollo Kotlin 客户端时遇到的错误处理问题,特别是当服务器返回非标准 HTTP 状态码时的解决方案。

问题背景

在使用 Apollo Kotlin 客户端时,开发者可能会遇到以下情况:服务器返回了包含详细错误信息的响应体,但客户端只能捕获到简单的 HTTP 状态码错误。这是因为 Apollo Kotlin 默认对非 2xx 状态码的响应不会尝试解析响应体。

错误响应处理机制

GraphQL 规范推荐服务器在验证错误时返回 200 状态码,错误详情应包含在响应体的 errors 字段中。这种设计使得客户端可以统一处理所有类型的 GraphQL 错误。

然而,有些服务器实现可能选择返回 400 或其他 4xx/5xx 状态码来表示错误。这种情况下,Apollo Kotlin 的默认行为是抛出 ApolloHttpException 而不解析响应体。

解决方案

方案一:修改服务器行为(推荐)

最佳实践是建议后端团队遵循 GraphQL over HTTP 规范,对于验证错误返回 200 状态码。这样客户端可以直接通过以下方式获取错误详情:

val response = apolloClient.query(MyQuery()).execute()
response.errors?.forEach { error ->
    println("Error message: ${error.message}")
}

方案二:启用错误响应体解析

如果无法修改服务器行为,可以在构建 ApolloClient 时启用 httpExposeErrorBody 选项:

val apolloClient = ApolloClient.Builder()
    .serverUrl("https://your.server/graphql")
    .httpExposeErrorBody(true)
    .build()

然后可以这样处理错误:

try {
    val response = apolloClient.query(MyQuery()).execute()
} catch (e: ApolloHttpException) {
    e.body?.use { responseBody ->
        val errorJson = responseBody.readUtf8()
        // 使用 kotlinx.serialization 或 Moshi 解析 JSON
    }
} catch (e: ApolloException) {
    // 处理其他 Apollo 异常
}

重要提示:使用 httpExposeErrorBody 时,必须确保调用 use 方法或在 finally 块中关闭响应体,以避免资源泄漏。

自定义错误解析

对于包含非标准字段(如 code 和 stacktrace)的错误响应,需要自定义解析逻辑。推荐使用 kotlinx.serialization 或 Moshi 等库来反序列化错误响应:

@Serializable
data class GraphQLErrorDetail(
    val message: String,
    val code: String? = null,
    val stacktrace: List<String>? = null
)

@Serializable
data class GraphQLErrorResponse(
    val errors: List<GraphQLErrorDetail>
)

// 解析示例
val errorResponse = Json.decodeFromString<GraphQLErrorResponse>(errorJson)
val firstError = errorResponse.errors.first()

最佳实践总结

  1. 尽量让服务器遵循 GraphQL over HTTP 规范,使用 200 状态码返回验证错误
  2. 对于无法修改的服务器,使用 httpExposeErrorBody 并正确处理响应体
  3. 对于复杂的错误结构,定义适当的数据类并使用 JSON 解析库
  4. 始终注意资源管理,确保关闭响应体
  5. 考虑将错误处理逻辑封装为可重用的组件

通过以上方法,开发者可以更全面、更灵活地处理 Apollo Kotlin 客户端中的各种错误场景,为用户提供更准确的错误信息和更好的错误处理体验。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
197
2.17 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
208
285
pytorchpytorch
Ascend Extension for PyTorch
Python
59
94
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
973
574
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
9
1
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
549
81
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
1.02 K
399
communitycommunity
本项目是CANN开源社区的核心管理仓库,包含社区的治理章程、治理组织、通用操作指引及流程规范等基础信息
393
27
MateChatMateChat
前端智能化场景解决方案UI库,轻松构建你的AI应用,我们将持续完善更新,欢迎你的使用与建议。 官网地址:https://matechat.gitcode.com
1.2 K
133