學習調用AI接口的時候,流式響應都是使用的?Transfer-Encoding: chunked,圖方便想用RestTemplate,但是平時用到的都是直接返回響應對象的類型。使用bing搜索到一種方式,使用下面的代碼來讀取,于是掉這個坑里了,浪費了我好長時間。
ResponseEntity<Resource> responseEntity = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, org.springframework.core.io.Resource.class);
PrintWriter writer = httpServletResponse.getWriter();
BufferedReader bufferedReader;
try {bufferedReader = new BufferedReader(new InputStreamReader(responseEntity.getBody().getInputStream()));String line;while ((line = bufferedReader.readLine()) != null && !(ChatGpt3dot5Request.STREAM_MESSAGE_PREFIX + "[DONE]").equals(line)) {String message = getMessageFromLine(line, ChatGpt3dot5Request.STREAM_MESSAGE_PREFIX);writer.write(message);writer.flush();}
} catch (IOException e) {throw new RuntimeException(e);
}
注意,上面的代碼是錯誤的,并不會實時讀取到數據,而是會等到響應全結束之后才能讀取到數據。
下面的才是正解:
restTemplate.execute(apiUrl, HttpMethod.POST, restTemplate.httpEntityCallback(requestEntity), new ResponseExtractor<ClientHttpResponse>() {@Overridepublic ClientHttpResponse extractData(ClientHttpResponse response) throws IOException {InputStream inputStream = response.getBody();/** 在這個地方從inputStream中讀取數據,或者調用自己的方法讀取inputStream來處理數據*/return response;}
});