java - 如何在 Spring 中编写仅通过另一个 API 发送响应的 REST 端点?

标签 java spring

我有一个 REST API,然后是一个带有 Spring 后端的 Web 应用程序。在Spring后端,我想创建一个路由,我们称之为api-proxy/get-data,它会转到API,我们称之为api/get-data >,无论它收到什么 HTTP 响应,它都应该直接将其发送到 Web 应用程序前端。现在我的代码看起来像这样:

@RequestMapping(
    value = "/api-proxy/get-data/{id}",
    method = RequestMethod.GET,
    produces = MediaType.APPLICATION_JSON_VALUE
)
public ResponseEntity<String> getData(@PathVariable String id)
{
    RestTemplate restTemplate = new RestTemplate();
    String apiURL = "http://myapi.com/api/get-data/" + id;
    ResponseEntity<String> response = restTemplate.getForEntity(apiURL, String.class);
    return response;
}

我认为这会起作用,但不幸的是,当 RestTemplate.getForEntity 获取 404 时,它不会返回带有 404 状态代码的 ResponseEntity ,它会引发异常。因此,我必须手动检查响应并在 catch block 中构建它的副本 - 并且对于 500 个服务器错误等也这样做。

在 Spring 中获得我想要的行为的正确方法是什么?无论我从上游 API 获得什么 HTTP 响应,我都希望将其准确发送到客户端、 header 等。几乎就像一个代理。

最佳答案

尝试下面的代码,它会给你错误的地方

ResponseEntity<String> response = restTemplate.exchange(Url, 
                                                        HttpMethod.GET, 
                                                        null, 
                                                        new ParameterizedTypeReference<String>>(){});

    if (response.getStatusCode().is2xxSuccessful()) {
        return response.getBody();
    } else if (response.getStatusCode().is4xxClientError()) {
        throw new Exception("Exception while "+response.getBody());
    } else if (response.getStatusCode().is5xxServerError()) {
        throw new Exception("Bad request error "+response.getBody());
    } else {
        throw new Exception("Exception while querying service "+response.getBody()); 
    }

关于java - 如何在 Spring 中编写仅通过另一个 API 发送响应的 REST 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53592114/

相关文章:

java - 递归查找数组中数字的最小路径

java - 如何在 Fragments 中使用来自 Main Activity 的 API 实例?

java - Spring Data Mongo 返回列表而不是字符串

spring - 做mockMvc测试时使用Mockito注册spring bean

java - Autowiring 字段仍然为空

java - Spring MVC 中如何使用 IoC 和 DI

java - onClickListener 用于在 popupWindow 之外进行触摸

java - Swing 菜单 Java 7 mac osx

java - Spring Data Gemfire 定位器

java - 如何为 Spring Boot 服务中的端点指定默认媒体类型