使用 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 响应作为字符串读取并从那里获取。一般步骤:

  1. restTemplate.exchange 进入字符串响应正文
  2. 设置 ObjectMapper
  3. 将其配置为接受单个值作为数组,并且 空字符串作为空对象
  4. 读入您选择的 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());
}