java - Web 服务能否从不同服务器上的 Web 服务获取自定义错误消息?
问题描述
我在服务器 A 上运行了一个 Web 服务,它在 Java ResponseEntity 对象中返回一条自定义错误消息,如下所示:
return new ResponseEntity<String>("My custom error message.", HttpStatus.BAD_REQUEST);
我在服务器 B 上运行了另一个 Web 服务,它调用服务器 A 上的 Web 服务,但不是“我的自定义错误消息”,而是得到以下信息:
无法解析 JSON。原始结果:服务器返回 HTTP 响应代码:400
如果我直接调用服务器 A 上的 Web 服务,那么我会得到一个错误 400,并按预期显示“我的自定义错误消息”。
我已将问题隔离到服务器 B 尝试读取服务器 A 的响应时。
BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
当服务器 B 从服务器 A 收到错误 400 时,conn.getInputStream() 会抛出一个 IOException,该异常被捕获,但“我的自定义错误消息”在异常中丢失。
catch (IOException e) {
return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
服务器 B 是否可以从服务器 A 返回自定义错误消息?怎么做到呢?
我正在使用 Java 8、Spring Boot 2.0.2、Tomcat 9 和 Swagger UI 2.8 来测试 Web 服务。
更新:如果服务器 A 返回代码 200 而不是 400,则不会在服务器 B 上抛出 IOException。而是抛出 JsonParseException 并且服务器 B 返回“我的自定义错误消息”。
解决方案
我认为发生这种情况的原因是您的异常虽然从 A 正确抛出,但在内部处理conn.getInputStream
了 BAD_REQUEST 异常。我可以猜到的一种可能的解决方案是,您在使输入流读取器的对象检查天气连接之前以某种方式检查是否引发了一些异常。
try{
conn.open();
BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()));
}catch(Exception e){
return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
类似于 conn.open 的方法应该在生成输入流读取器对象之前抛出您的自定义异常
推荐阅读
- laravel - 试图获取非对象 Laravel 的属性“用户”
- prometheus - 非零值的 PromQL avg_over_time
- reactjs - 从 GET 请求中获取数据
- flutter - 输入'未来
' 不是 'Widget' 类型的子类型 - ios - 为什么 Flutter 不重用之前创建的线程?
- android - 为什么 webView.setWebChromeClient(new WebChromeClient()); 导致屏幕变黑?
- react-native - 有没有办法使用 wix navigation expo react native
- swift - ImagePicker 错误:错误域 = PlugInKit 代码 = 13
- mysql - 如何在多个表上执行完全外连接
- node.js - 在使用 axios POST 请求发送数据以及在另一个微服务中获取/获取数据方面需要帮助