From 1b9bebf7e4dbd229cc4d58902722de9ea56965dc Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 17 Nov 2025 10:31:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(facebody):=20=E4=BC=98=E5=8C=96=E4=BA=BA?= =?UTF-8?q?=E8=84=B8=E6=90=9C=E7=B4=A2=E5=A4=B1=E8=B4=A5=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E8=AF=95=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 提取error_code到局部变量避免重复调用 - 增加对错误码22204的处理逻辑,当URL图片无法访问时尝试下载并转换为base64后重试 - 添加重试成功后的完整响应处理流程 - 记录详细的重试过程日志便于问题排查 - 保留原始错误响应的日志记录 - 确保所有异常路径都返回有效的响应对象 --- .../facebody/adapter/BceFaceBodyAdapter.java | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ycwl/basic/facebody/adapter/BceFaceBodyAdapter.java b/src/main/java/com/ycwl/basic/facebody/adapter/BceFaceBodyAdapter.java index 578fb069..52231da3 100644 --- a/src/main/java/com/ycwl/basic/facebody/adapter/BceFaceBodyAdapter.java +++ b/src/main/java/com/ycwl/basic/facebody/adapter/BceFaceBodyAdapter.java @@ -314,7 +314,8 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter { } catch (InterruptedException ignored) { } JSONObject response = client.search(faceUrl, "URL", dbName, options); - if (response.getInt("error_code") == 0) { + int errorCode = response.getInt("error_code"); + if (errorCode == 0) { resp.setOriginalFaceScore(100f); JSONObject resultObj = response.getJSONObject("result"); if (resultObj == null) { @@ -337,7 +338,52 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter { resp.setFirstMatchRate(result.getFirst().getScore()); } return resp; + } else if (errorCode == 222204) { + // error_code: 222204 表示无法正常访问URL图片,尝试下载并转换为base64后重试 + log.warn("搜索人脸时无法正常访问URL图片,错误码: 222204,尝试下载图片转base64后重试,URL: {}", faceUrl); + String base64Image = downloadImageAsBase64(faceUrl); + if (base64Image != null) { + try { + searchFaceLimiter.acquire(); + } catch (InterruptedException ignored) { + } + JSONObject retryResponse = client.search(base64Image, "BASE64", dbName, options); + if (retryResponse.getInt("error_code") == 0) { + log.info("使用base64重试搜索人脸成功"); + resp.setOriginalFaceScore(100f); + JSONObject resultObj = retryResponse.getJSONObject("result"); + if (resultObj == null) { + resp.setFirstMatchRate(0f); + return resp; + } + JSONArray userList = resultObj.getJSONArray("user_list"); + List result = new ArrayList<>(); + for (int i = 0; i < userList.length(); i++) { + JSONObject user = userList.getJSONObject(i); + SearchFaceResultItem item = new SearchFaceResultItem(); + item.setDbName(dbName); + item.setFaceId(user.getString("user_id")); + item.setExtData(user.getString("user_info")); + item.setScore(user.getBigDecimal("score").divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP).floatValue()); + result.add(item); + } + resp.setResult(result); + if (!result.isEmpty()) { + resp.setFirstMatchRate(result.getFirst().getScore()); + } + return resp; + } else { + log.warn("使用base64重试搜索人脸仍失败!{}", retryResponse); + resp.setOriginalFaceScore(0f); + return resp; + } + } else { + log.error("下载图片转base64失败,无法重试,URL: {}", faceUrl); + resp.setOriginalFaceScore(0f); + return resp; + } } else { + log.warn("搜索人脸失败,错误码: {}, 响应: {}", errorCode, response); resp.setOriginalFaceScore(0f); return resp; }