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

