如何从Java后端正确返回第三方API的HttpServletResponse至Angular前端?
问题原因与解决方案
你的问题出在Java后端调用第三方API时,没有正确处理非成功状态码的响应,导致前端无法拿到真实的错误信息。
当前代码里的ClientResponse::toBodilessEntity方法仅在第三方API返回2xx成功状态码时能正常解析,一旦返回409这类错误状态,它会直接抛出异常,而Spring默认会把这个异常转换成通用的错误响应(比如你看到的「0 Unknown」),没有把第三方的真实状态码和错误信息透传给前端。
修复步骤
1. 修改第三方API调用逻辑,透传所有状态码
把exchangeToMono(ClientResponse::toBodilessEntity)替换为自定义处理逻辑,不管响应状态是否成功,都原样构建ResponseEntity返回:
public ResponseEntity<Void> addForward(String username, String forward) { return localApiClient.put() .uri(baseUrl + username + "/targets/" + forward) .contentType(MediaType.APPLICATION_JSON) .exchangeToMono(clientResponse -> // 直接根据第三方响应的状态码和请求头构建ResponseEntity Mono.just(ResponseEntity.status(clientResponse.statusCode()) .headers(headers -> headers.putAll(clientResponse.headers().asHttpHeaders())) .build()) ) .block(REQUEST_TIMEOUT); }
2. 可选:保留错误响应体(如果第三方API返回错误信息)
如果第三方API在错误场景下会返回响应体,你可以把ResponseEntity<Void>改成ResponseEntity<String>或者自定义错误DTO,同时读取响应体内容:
public ResponseEntity<String> addForward(String username, String forward) { return localApiClient.put() .uri(baseUrl + username + "/targets/" + forward) .contentType(MediaType.APPLICATION_JSON) .exchangeToMono(clientResponse -> clientResponse.bodyToMono(String.class) .map(body -> ResponseEntity.status(clientResponse.statusCode()) .headers(headers -> headers.putAll(clientResponse.headers().asHttpHeaders())) .body(body)) ) .block(REQUEST_TIMEOUT); }
这样修改后,后端会把第三方API的状态码、响应头、响应体原封不动透传给前端,前端就能拿到和直接调用第三方API时一致的错误信息了。
内容的提问来源于stack exchange,提问作者Jack Boch
相关产品推荐
相关产品推荐

