RestTemplate在重定向url上返回“嵌套异常为org.apache.http.client.ClientProtocolException”

时间:2019-07-19 09:11:35

标签: java spring-boot resttemplate http-get http-redirect

如果有人确实知道一种调试方法,那也很好。我会做的。但是目前我在调试此程序方面没有任何进展。

我有一个URL说URL-A,它总是返回302。但是当我在Spring Boot项目中使用当前的RestTemplate配置(在当前配置下面粘贴)以10个循环运行URL-A时,我却得到了以下异常。也就是说,我也可以这样说,我也可以获取成功响应以获取请求。

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "URL-A": null; nested exception is org.apache.http.client.ClientProtocolException
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.getForEntity(RestTemplate.java:319)
....
...
...
Caused by: org.apache.http.client.ClientProtocolException: null
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
at org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:89)
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:659)
... 96 common frames omitted                                   
Caused by: org.apache.http.ProtocolException: The server failed to respond with a valid HTTP response
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:151)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:167)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
... 102 common frames omitted

使用的当前RestTemplate配置:

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();

    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

    objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
    objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
    objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    return objectMapper;
}

@Bean
public RestTemplate getRestTemplate() {
    RestTemplate newTemplate = new RestTemplate();
    newTemplate.setRequestFactory(this.getHttpComponentsClientHttpRequestFactory());
    ObjectMapper objectMapper = this.objectMapper();
    MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
    jackson2HttpMessageConverter.setObjectMapper(objectMapper);
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    messageConverters.add(new StringHttpMessageConverter());
    messageConverters.add(jackson2HttpMessageConverter);
    messageConverters.add(new ByteArrayHttpMessageConverter());
    newTemplate.setMessageConverters(messageConverters);
    return newTemplate;
}

private HttpComponentsClientHttpRequestFactory getHttpComponentsClientHttpRequestFactory() {
    PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
    poolingHttpClientConnectionManager.setMaxTotal(maxTotal);
    poolingHttpClientConnectionManager.setDefaultMaxPerRoute(maxPerRoute);
    HttpClient client = HttpClients.custom().setConnectionManager(poolingHttpClientConnectionManager).build();
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(client);
    factory.setConnectTimeout(connectTimeout);
    factory.setReadTimeout(readTimeout);
    return factory;
}

我尝试过的事情和创立:

  1. 如果我注释/删除该行-newTemplate.setRequestFactory(this.getHttpComponentsClientHttpRequestFactory());,但没有错误,则我将没有连接池。
  2. 使用resttemplate = new RestTemplateBuilder().setConnectTimeout(100000).setReadTimeout(100000).build()进行了尝试,因为这样可以避免上述配置。但是它仍然没有用。 我不明白是什么原因导致此错误?我尝试浏览restTemplate代码,但无法到达任何地方。

0 个答案:

没有答案