rpc调用无法获取异常信息解决

news/2025/2/7 1:57:13/

原本http请求的写法如下:
   

private static Executor httpExecutor;static {// 设置重试策略,自定义,不忽略任何异常(即:任何异常都会重试),参考:DefaultHttpRequestRetryHandlerHttpRequestRetryHandler retryHandler = (IOException exception, int executionCount, HttpContext context) -> executionCount <= 2;HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(2000).setMaxConnPerRoute(500).setRetryHandler(retryHandler).build();httpExecutor = Executor.newInstance(httpClient);}/*** aisd相关专用,超时时间200s* @param body* @param headers* @param uri* @return*/public static String postRequestForAISD(String body, Map<String, String> headers, String uri) {log.info("POST {} {}, Headers: {}", uri, body, mapToKeyValue(headers));long beginTime = System.currentTimeMillis();try {Request httpRequest = Request.Post(uri).connectTimeout(50000).socketTimeout(50000).bodyString(body, ContentType.APPLICATION_JSON);if (headers != null && headers.size() > 0) {headers.forEach(httpRequest::addHeader);}String result = httpExecutor.execute(httpRequest).returnContent().asString(Consts.UTF_8);long endTime = System.currentTimeMillis();log.info("POST,uri:{},millis:{},params:{}, Headers: {},result:{}", uri,endTime-beginTime, body, mapToKeyValue(headers), result);return result;} catch (HttpResponseException e) {log.error("POST_HttpResponseException", e);throw new RuntimeException("接口调用失败[StatusCode:" + e.getStatusCode() + ", Msg:" + e.getMessage() + "]");} catch (IOException e) {log.error("POST_IOException", e);throw new RuntimeException("接口调用失败[" + e.getMessage() + "]");}}


上面的调用只能拿到不明确的错误信息,如下:
StatusCode:400, Msg:status code: 400, reason phrase: model_error]

但是直接curl调用外部接口却可以获取详细错误信息,实例如下:
{
  "error": {
    "message": "This model's maximum context length is 8192 tokens. However, you requested 8301 tokens (7277 in the messages, 1024 in the completion). Please reduce the length of the messages or completion.",
    "type": "invalid_request_error",
    "param": "messages",
    "code": "context_length_exceeded"
  }
}

问题:上面的http请求的代码为什么拿不到详细的错误信息?怎么处理才能拿到详细的错误信息?

核心是下面这行代码:
String result = httpExecutor.execute(httpRequest).returnContent().asString(Consts.UTF_8);

httpExecutor.execute(httpRequest)获取到Response,然后调用returnContent方法获取返回内容,
如果rpc请求返回的不是200,那么会抛出HttpResponseException异常,进入catch(HttpResponseException e)分支,抛出RuntimeException异常,提示接口调用失败。如果rpc请求返回的不是200,但是没有抛出HttpResponseException异常,那么会进入catch(IOException e)分支,同样抛出RuntimeException异常,提示接口调用失败。
因此,无论rpc请求返回的是什么状态码,都会抛出RuntimeException异常,导致接口调用失败。但不会获取失败的详情。
解决:修改为先获取returnResponse,然后获取返回实例:
 

  /*** aisd相关专用,超时时间200s* @param body* @param headers* @param uri* @return*/public static String postRequestForAISD(String body, Map<String, String> headers, String uri) {log.info("POST {} {}, Headers: {}", uri, "", mapToKeyValue(headers));long beginTime = System.currentTimeMillis();try {Request httpRequest = Request.Post(uri).connectTimeout(50000).socketTimeout(50000).bodyString(body, ContentType.APPLICATION_JSON);if (headers != null && headers.size() > 0) {headers.forEach(httpRequest::addHeader);}Response execute = httpExecutor.execute(httpRequest);HttpResponse httpResponse = execute.returnResponse();// 获取响应状态码int statusCode = httpResponse.getStatusLine().getStatusCode();String result = "";// 如果响应状态码不是200,则表示请求出错if (statusCode != 200) {// 获取错误信息String errorResponse = EntityUtils.toString(httpResponse.getEntity());log.info("errorResponse:"+errorResponse);throw new RuntimeException("接口调用失败[StatusCode:" + statusCode + ", Msg:" + errorResponse + "]");} else {result  = EntityUtils.toString(httpResponse.getEntity());;}long endTime = System.currentTimeMillis();log.info("POST,uri:{},millis:{},params:{}, Headers: {},result:{}", uri,endTime-beginTime, body, mapToKeyValue(headers), result);return result;} catch (HttpResponseException e) {log.error("POST_HttpResponseException", e);throw new RuntimeException("接口调用失败[StatusCode:" + e.getStatusCode() + ", Msg:" + e.getMessage() + "]");} catch (IOException e) {log.error("POST_IOException", e);throw new RuntimeException("接口调用失败[" + e.getMessage() + "]");}}

什么具体场景会让Response的返回内容是空,但HttpResponse的实体不为空呢?能给出具体的实例吗
有以下几种可能的场景:
1. 服务器返回的响应内容为空,这种情况下Response的返回内容是空的,但是HttpResponse的实体可能不为空,因为服务器可能会返回一些响应头信息或者状态码等其他信息。
2. 服务器返回的响应内容格式不正确,这种情况下Response的返回内容是空的,但是HttpResponse的实体可能不为空,因为服务器可能会返回一些错误信息或者其他格式不正确的内容。
3. 网络传输过程中出现异常,这种情况下Response的返回内容是空的,但是HttpResponse的实体可能不为空,因为网络传输过程中可能只传输了部分内容,或者传输过程中出现了错误,但是已经传输的内容仍然可以被获取。
例如,当使用HttpClient发送请求时,如果服务器返回的响应内容为空,但是响应头信息或者状态码不为空,那么Response的返回内容就是空的,但是HttpResponse的实体可能不为空,可以通过调用getEntity方法获取实体。


http://www.ppmy.cn/news/750882.html

相关文章

机器人轨迹生成:轨迹规划与路径规划

机器人轨迹生成涉及到轨迹规划和路径规划两个关键概念&#xff0c;它们是机器人运动控制中的重要组成部分。下面对轨迹规划和路径规划进行深入比较。 轨迹规划&#xff08;Trajectory Planning&#xff09;&#xff1a; 定义&#xff1a;轨迹规划是指在机器人运动中确定机器人末…

打字慢能学计算机吗,提高电脑打字速度,实现快速盲打,这样的学习方法很管用!...

现代人工作生活都离不开电脑,我们使用电脑最多的操作就是打字,无论英文中文都需要我们尽可能快速地输入文字。有的人不看键盘就能实现快速盲打,而有的人眼睛死盯键盘,东找西摸,半天才能敲上一个字。为了提高效率,大家都想成为电脑打字高手,大家都非常羡慕盲打快速录入文…

计算机键盘操作与基指法,计算机键盘操作.doc

计算机键盘操作 学校实验中学年级七年级学科信息技术授课人鲍广英班级新授课备课时间年 月 日课题计算机键盘操作 授课时间年 月 日教学目标认知目标知识目标&#xff1a;⒈了解键盘分区⒉掌握常用非字母键的功能⒊掌握正确的录入姿势和指法⒋熟记26个字母键的键位分布并初步实…

小学计算机学打字教学教案,小学信息技术《键盘一家》的教学设计

第1篇:小学信息技术《键盘一家》的教学设计 1.认识键盘。 2.了解键盘*作指法。 3.学会中排键的*作指法。 4.学会写字板的启动和退出。 5.学会正确的打字姿势。 学会基本键指法,学会正确的打字姿势。 不看键盘输入基本键字母。 实物键盘、课件 一、一览键盘 1.引入:(播…

金山打字专业文章计算机,练打字试卷_推荐几篇适合学生练习打字的文章_淘题吧...

❶ 用金山打字通软件练习了一段时间,打字速度显示一分钟最高81个字,自己觉得平均有40到60个字 继续练习吧,熟练度还不够,对输入法的了解还不够,输入法有时候可以使用4个键就能打出一个很长的词,常用词比如“好好学习”只要打“hhxx”就出了。文言文会用到很多生僻字,比较…

台式计算机打字标准手法,怎样才能练好标准的打字方法?电脑键盘打字指法教学...

这篇文章是关于学习打字方法&#xff0c;和如何快速打字(盲打)&#xff0c;可以帮助大家快速的学会打字&#xff0c;解除电脑上打字慢的困扰。总之&#xff0c;本文会有效、快速地帮助你学会打字。只需要平常打字时注意一下方法&#xff0c;慢慢的就会了。 电脑键盘打字指法教学…

计算机打字的基础知识,学习电脑打字基础知识

学习前的准备&#xff1a; 建立信心、保持毅力&#xff0c;假如以每天练习一个小时来算&#xff0c;要做到多数时候不看键盘打字&#xff0c;只需约两个星期的时间&#xff1b;如果要通过专业检定(每分钟30个字)&#xff0c;最多也只需再多花半个月时间反覆练习。 许多人使用电…

0005 键盘打字如何练成像黑客一样的飞速

相信大家看过很多电影里面,黑客在打电脑键盘的时候,手指飞快的移动敲击键盘,给人的感觉是好厉害!