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

调用REST API时如何处理MyObject与MyError两种不同返回类型?

问题场景处理方案

你可以通过以下几种方式处理多响应类型的解析场景,按适用优先级排序:


1. 优先通过HTTP状态码区分(标准REST API场景)

这是最符合REST规范、可维护性最高的方案,优先推荐使用
绝大多数REST规范的接口会用状态码区分正常/错误响应:2xx状态码对应正常业务返回MyObject,4xx/5xx状态码对应错误返回MyError,处理逻辑如下:

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
int status = response.statusCode();
String body = response.body();
if (status >= 200 && status < 300) {
    // 正常响应解析为MyObject
    MyObject myObject = objectMapper.readValue(body, MyObject.class);
    // 处理正常业务逻辑
} else {
    // 错误响应解析为MyError
    MyError myError = objectMapper.readValue(body, MyError.class);
    // 处理错误逻辑
}

2. 状态码无法区分时通过JSON特征判断

如果接口不符合REST规范,所有场景都返回200状态码,可以先把响应体解析为JsonNode,通过两个类的独有字段判断类型后再转换:

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String body = response.body();
JsonNode rootNode = objectMapper.readTree(body);

// 假设MyObject有独有的业务字段data,MyError有独有的错误字段errorCode
if (rootNode.has("data")) {
    MyObject myObject = objectMapper.treeToValue(rootNode, MyObject.class);
    // 处理正常业务逻辑
} else if (rootNode.has("errorCode")) {
    MyError myError = objectMapper.treeToValue(rootNode, MyError.class);
    // 处理错误逻辑
} else {
    // 兜底处理未匹配的响应格式
    throw new RuntimeException("无法识别的响应格式");
}

3. 兜底异常捕获兼容

如果没有明确的字段区分规则,可以加异常捕获做兼容:

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String body = response.body();
MyObject myObject = null;
MyError myError = null;
try {
    myObject = objectMapper.readValue(body, MyObject.class);
} catch (JsonProcessingException e) {
    // 解析MyObject失败,尝试解析为MyError
    myError = objectMapper.readValue(body, MyError.class);
}

if (myObject != null) {
    // 正常逻辑
} else if (myError != null) {
    // 错误逻辑
}

内容的提问来源于stack exchange,提问作者Prodox21

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:27:00