2016-06-24 11 views
0

Использования Spring RestTemplate, буфер телом запроса устанавливается в ложное и пустого телозапрос PUT с небуферизованным RestTemplate

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); 
requestFactory.setBufferRequestBody(false); 
requestFactory.setConnectTimeout(60_000); 
RestTemplate restTemplate = RestTemplate(requestFactory); 
restTemplate.exchange(uri, HttpMethod.PUT, new HttpEntity<>(httpHeaders), Void.class); 

Я получаю 411 - Length Required код состояния в ответ. По какой-то причине Spring RestTemplate не помещает заголовок Content-Length: 0 на запрос.

В случае, если я прокомментирую requestFactory.setBufferRequestBody(false); линия, он отлично работает. Но мне нужно это для отправки больших файлов.

UPD: просмотр журналов отладки показал нам, что этот запрос не содержит заголовок Content-Length.

+0

Можете ли вы добавить значения параметров к вызову 'restTemplate.exchange'? –

+0

Обновление до HttpMethod.PUT. Но другие параметры несущественны. uri - некоторые утилиты rackspace service, httpHeaders - токен авторизации. – dmitryvim

+0

Проблема заключается в том, что в этом запросе нет заголовка Content-Length. Проверено с помощью журнала debug resttemplate. – dmitryvim

ответ

1

Мне удалось повторить вашу проблему с RestTemplate и SimpleClientHttpRequestFactory. После перехода на Apache HttpComponents HttpClient проблема исчезла.

Здесь вы, как я настроил RestTemplate:

import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClientBuilder; 
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; 
import org.springframework.web.client.RestTemplate; 

CloseableHttpClient httpClient = HttpClientBuilder 
    .create() 
    .build(); 
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); 
factory.setBufferRequestBody(false); 

RestTemplate restTemplate = new RestTemplate(factory); 
restTemplate.exchange(......); 

Надеется, что это помогает.

0

У меня такая же проблема. Я не решил его с помощью RestTemplate. Я решил это таким образом:

import org.apache.http.HttpEntity; 
import org.apache.http.client.methods.CloseableHttpResponse; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.ContentType; 
import org.apache.http.entity.mime.MultipartEntityBuilder; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 

CloseableHttpClient httpClient = HttpClients.createDefault(); 
HttpPost uploadFile = new HttpPost("you_url"); 
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
FileBody fileBody = new FileBody(tempFile.toFile(), ContentType.MULTIPART_FORM_DATA, "file_name"); 
     builder.addPart("parameter_name", fileBody); 
     HttpEntity multipart = builder.build(); 
     uploadFile.setEntity(multipart); 

     try (CloseableHttpResponse response = httpClient.execute(uploadFile)) { 
      //.... 
     }