You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:05:24