java - 期望两种类型的返回对象时如何编写我的 REST API 调用

标签 java spring rest

我使用 Spring 编写了一个 REST 端点。

@RequestMapping(value = "/staticdata/userPreference/extUserId/{extUserId}/type/{type}", method = RequestMethod.GET)
public ResponseEntity<List<UserPreference>> getData(
        @PathVariable String extUserId,
        @PathVariable String type) {

    List<UserPreference> userPreferences = null;
    userPreferences = staticDataService.getUserPreference(extUserId, type);
    return new ResponseEntity<List<UserPreference>>(userPreferences, HttpStatus.OK);
}

@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleError(HttpServletRequest req, Exception exception) {
    return new ResponseEntity<String>(exception.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}

当getData()方法能够成功获取数据时,需要返回List<>。但是当出现异常时。该消息将被返回。这是由 handleError() 方法处理的。此方法返回一个字符串。

我的问题是: 使用 Spring 提供的 restTemplate 调用此 rest 服务应该如何?该方法的返回值可以是一个列表,也可以是一个基于成功或失败的字符串。

最佳答案

你可以试试RestTemplate#exchange执行请求并获得 ResponseEntity 的响应然后获取List<UserPreference>通过 ResponseEntity#getBody .

如果有错误,可以从HttpStatusCodeException.getResponseBodyAsString获取错误响应.

示例如下:

try {
    HttpHeaders headers = new HttpHeaders();
    // add some headers
    HttpEntity<String> request = new HttpEntity<String>(headers);    
    ResponseEntity<List<UserPreference>> response = restTemplate.exchange(
        YOUR_URL, HttpMethod.GET, request, new ParameterizedTypeReference<List<UserPreference>>() {});
    List<UserPreference> userPerference = response.getBody();
} catch (HttpStatusCodeException e) {
    String errorBody = e.getResponseBodyAsString();
}

如果您需要对错误进行一些更特殊的处理,您可以尝试实现自定义 ResponseErrorHandler .

已编辑:

以下是演示代码示例:

一个测试RestController有一个RequestMapping如果请求路径是“/test?error=true”,这将抛出异常。否则,返回 List<String>回应:

@RestController
public class TestController {

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public ResponseEntity<List<String>> getData(@RequestParam(value = "error", required = false) String error) {
        if (error != null && error.equals("true")) {
            throw new HttpClientErrorException(HttpStatus.NOT_FOUND);
        } else {
            List<String> list = new ArrayList<>();
            list.add("test");
            return new ResponseEntity<List<String>>(list, HttpStatus.OK);
        }
    }

    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<String> handleError(HttpServletRequest req, Exception exception) {
        return new ResponseEntity<String>("Exception Message", HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

测试配置:

@SpringBootApplication
public class TestConfig {

}

集成测试有 2 个测试用例。一种是测试获取List响应,另一种是测试从错误响应中获取消息体:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfig.class)
@WebIntegrationTest
public class IntegrationTest {

    @Value("${local.server.port}")
    int port;

    final RestTemplate template = new RestTemplate();

    @Test
    public void testGetListResponse() {
        String url = "http://localhost:" + port + "/test";
        ResponseEntity<List<String>> response = template.exchange(
                url, HttpMethod.GET, null, new ParameterizedTypeReference<List<String>>() {});
        List<String> list = response.getBody();
        Assert.assertEquals(list.size(), 1);
        Assert.assertEquals(list.get(0), "test");
    }

    @Test
    public void testGetErrorResponse() {
        String url = "http://localhost:" + port + "/test?error=true";
        String errorBody = null;
        try {
            ResponseEntity<List<String>> response = template.exchange(
                    url, HttpMethod.GET, null, new ParameterizedTypeReference<List<String>>() {
                    });
        } catch (HttpStatusCodeException e) {
            errorBody = e.getResponseBodyAsString();
        }
        Assert.assertEquals(errorBody, "Exception Message");
    }
}

希望对您有所帮助。

关于java - 期望两种类型的返回对象时如何编写我的 REST API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38249204/

相关文章:

java - 创建项目时 Eclipse Oxygen 上的 Maven 出现 "Could not resolve archetype"错误

如果串行端口保持打开状态,Java 应用程序将不会退出

java - 如何解决 "Error creating bean with name ' 步骤 2' defined in class path resource "异常

java - Spring REST 406 Http 错误

java - android 中错误的 CRC32 散列

Java 密码 DES 奇怪的结果

java - Spring MVC - 将相同的对象从一个页面传输到另一个页面

java - Spring Kafka 与 Confluence Kafka Avro 反序列化器

c# - Web API JSON 响应

asp.net - 使用 HTTPClient 和 Sharepoint 2013 REST API 获取文档