我已经创建了Spring boot(2.1.4.RELEASE)REST端点来从服务器获取一些数据。当我从浏览器调用此终结点时,在浏览器窗口中看到JSON,但我注意到fav图标中的微调器将持续60秒。当我查看“网络”标签时,我再也看不到请求的响应部分。 60秒后,它表示失败。当我遍历调试器中的代码时,我看到数据正在从控制器中返回,并且当我“播放”其余的堆栈时,一切都完成了(分配给服务于请求的线程),我有点不解这种行为。
@GetMapping(path="/recipes")
public ResponseEntity<Collection<HpManifest>> getRecipes() {
ResponseEntity<Collection<HpManifest>> response = hpService.getRecipes();
return response;
}
public ResponseEntity<Collection<HpManifest>> getRecipes() {
logger.info("Retrieving recipes from");
UriComponentsBuilder builder =
UriComponentsBuilder.fromHttpUrl(endpointManifests)
.queryParam("type", HpManifestType.RECIPE.getType());
logger.info("REST endpoint: " + builder.toUriString());
ResponseEntity<Collection<HpManifest>> recipes = restTemplate.exchange(
builder.toUriString(),
HttpMethod.GET, null, new ParameterizedTypeReference<Collection<HpManifest>>() {});
logger.info("recipes are:");
recipes.getBody().forEach(r -> logger.info(r.toString()));
return recipes;
}
答案 0 :(得分:1)
前几天,我遇到了类似的问题。在我的情况下,事实证明recipes
(从restTemplate.exchange
方法返回)的标头中包含Transfer-Encoding: chunked
,然后当您返回recipes
时,您的spring框架是可能还包含一个Content-Length
标头。这两个标头的组合在对浏览器的响应中可能会导致问题,因为浏览器认为它正在获取分块的数据,但实际上并非如此。我建议根据以下内容从您的ResponseEntity
变量中创建一个新的recipes
:
return ResponseEntity.status(recipes.getStatusCode()).body(response.getBody());
或者,您可以强制Spring框架返回分块数据,但是我认为这不是正确的方法。