【问题标题】:PUT request with unbuffered RestTemplate使用无缓冲 RestTemplate 的 PUT 请求
【发布时间】:2016-06-24 07:39:41
【问题描述】:

使用 Spring RestTemplate,缓冲请求正文设置为 false 和空正文

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 标头。

【问题讨论】:

  • 您能否在restTemplate.exchange调用中添加参数值?
  • 更新到 HttpMethod.PUT。但其他参数并不重要。 uri - 一些机架空间服务 uri,httpHeaders 是单一授权令牌。
  • 问题是,该请求中没有标头 Content-Length。使用 debug resttemplate logging 检查它。
  • 我最感兴趣的是你如何阅读和发送文件。
  • 可能http客户端使用chunked encoding:en.wikipedia.org/wiki/Chunked_transfer_encoding。您发送的文件大小是多少?

标签: java spring resttemplate requestfactory spring-web


【解决方案1】:

我设法用RestTemplateSimpleClientHttpRequestFactory 复制了您的问题。切换到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(......);

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我也有同样的问题。我还没有用 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)) {
                //....
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多