使用 RestTemplate.exchange 和不一致的 API 响应
Using RestTemplate.exchange with an inconsistent API response
我所说的不一致是指变量类型可能因 API 响应而异。所以一个命名变量可以是一个对象,一个对象列表,或者甚至是一个字符串。我不会也无法控制第三方 API 我正在消费。
我用的是restTemplate.exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables)
,顶层responseType是一致的。它在类型可能不同的子(和后代)对象中。
我是否一直坚持将 API 响应作为字符串使用并进行手动解析?或者有没有办法处理变量类型可能映射不同的事实(类似于 GSON 支持自定义序列化/反序列化的方式)。
设法找到解决这个问题的方法。我确实必须将 API 响应作为字符串读取并从那里获取。一般步骤:
restTemplate.exchange
进入字符串响应正文
- 设置 ObjectMapper
- 将其配置为接受单个值作为数组,并且
空字符串作为空对象
- 读入您选择的 POJO
现在,这并不适合所有人 - 在一个完美的世界中,您根本不需要放松 JSON 解析规则。这都是因为我正在处理一个非常不一致的 API.
粗略的代码示例是 as-follows(因为我们的内部堆栈非常复杂,所以我不得不从 类 中拖出一些位):
String exampleEndpoint = Constants.EXAMPLE_ENDPOINT;
ResponseEntity<String> responseEntity = restTemplate.exchange(uri.toString(), HttpMethod.GET, null, String.class);
String stringResponse = responseEntity.getBody();
ExamplePOJO examplePojo = null;
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
try {
examplePojo = mapper.readValue(stringResponse, ExamplePOJO.class);
} catch (JsonProcessingException | NullPointerException ne) {
// JsonProcessingException is from readValue, NPE is to catch the string response
// being null in the event you don't want to let it bubble up further
logger.error(ne.getLocalizedMessage());
}
我所说的不一致是指变量类型可能因 API 响应而异。所以一个命名变量可以是一个对象,一个对象列表,或者甚至是一个字符串。我不会也无法控制第三方 API 我正在消费。
我用的是restTemplate.exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables)
,顶层responseType是一致的。它在类型可能不同的子(和后代)对象中。
我是否一直坚持将 API 响应作为字符串使用并进行手动解析?或者有没有办法处理变量类型可能映射不同的事实(类似于 GSON 支持自定义序列化/反序列化的方式)。
设法找到解决这个问题的方法。我确实必须将 API 响应作为字符串读取并从那里获取。一般步骤:
restTemplate.exchange
进入字符串响应正文- 设置 ObjectMapper
- 将其配置为接受单个值作为数组,并且 空字符串作为空对象
- 读入您选择的 POJO
现在,这并不适合所有人 - 在一个完美的世界中,您根本不需要放松 JSON 解析规则。这都是因为我正在处理一个非常不一致的 API.
粗略的代码示例是 as-follows(因为我们的内部堆栈非常复杂,所以我不得不从 类 中拖出一些位):
String exampleEndpoint = Constants.EXAMPLE_ENDPOINT;
ResponseEntity<String> responseEntity = restTemplate.exchange(uri.toString(), HttpMethod.GET, null, String.class);
String stringResponse = responseEntity.getBody();
ExamplePOJO examplePojo = null;
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
try {
examplePojo = mapper.readValue(stringResponse, ExamplePOJO.class);
} catch (JsonProcessingException | NullPointerException ne) {
// JsonProcessingException is from readValue, NPE is to catch the string response
// being null in the event you don't want to let it bubble up further
logger.error(ne.getLocalizedMessage());
}