我使用 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/