Я пишу функцию для запросов POST к нескольким API REST.
Вот код, который я придумал.
@Autowired
@Qualifier("restTemplate")
RestTemplate restTemplate;
public String post(String lambdaApiBasicUri, String pathPostfix, String reqBody) throws Exception {
HttpEntity<String> requestEntity = new HttpEntity<String>(reqBody, createHeaders());
ResponseEntity<String> responseEntity = restTemplate.exchange(
createReqUrl(lambdaApiBasicUri, pathPostfix),
HttpMethod.POST,
requestEntity,
String.class);
return responseEntity.getBody();
}
Это прекрасно работает во всех случаях, кроме случаев, когда в одном конкретном сообщении об ошибке от API есть символы <
и >
в теле. В этом случае это дает мне следующую ошибку:
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://example.com/abc": Attempted read from closed stream.; nested exception is java.io.IOException: Attempted read from closed stream.
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:673)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:620)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:538)
Я узнал от поиска в Google, что это исключение возникает, когда мы пытаемся «потреблять» ответ более одного раза. Но проблема в том, что я никогда не добираюсь до части, где responseEntity.getBody();
называется. Ошибка вызывается в самом вызове restTemplate.exchange ().
Я смог решить проблему, сложив вызов resttempalte.execute()
вместо restTemplate.exchange()
. Но я хочу знать, почему выбрасывается эта ошибка.