【问题标题】:Can a web service get a custom error message from a web service on a different server?Web 服务能否从不同服务器上的 Web 服务获取自定义错误消息?
【发布时间】:2018-08-25 00:05:13
【问题描述】:

我在服务器 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 返回“我的自定义错误消息”。

【问题讨论】:

  • 如果服务器 B 期待 JSON,请尝试在您的字符串值中添加引号。
  • 这删除了“无法解析 JSON。原始结果:”部分,但客户端仍然不知道为什么服务器返回 HTTP 错误 400。

标签: java spring-boot


【解决方案1】:

我认为发生这种情况的原因是您的异常虽然从 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 的方法应该在生成输入流读取器对象之前抛出您的自定义异常

【讨论】:

  • 我可以让服务器 B 在向服务器 A 发送请求之前检查正文的内容,但服务器 A 已经检查了它收到的内容。我想避免在两台服务器上重复代码,但这似乎是不可避免的。
猜你喜欢
  • 2012-10-22
  • 2011-01-09
  • 2016-12-09
  • 2012-09-05
  • 1970-01-01
  • 2014-08-13
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多