首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RestEasy客户端3.0.*处理大型内容

RestEasy客户端3.0.*处理大型内容
EN

Stack Overflow用户
提问于 2013-04-11 14:29:58
回答 1查看 1.3K关注 0票数 1

我们使用的是RestEasy客户端版本3.0*。

我们正试图在请求体中发布非常大的内容。

当内容长度小于1MB时,以下代码将正确运行。

当内容长度非常大(约500 MB)时,请求将被阻塞。

代码如下所示:

代码语言:javascript
复制
InputStream inputStream = new FileInputStream(tempFile);
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target("<SomeUrl>");
response = target.request(MediaType.WILDCARD).post(Entity.entity(inputStream, MediaType.WILDCARD));

如何更改代码以支持大内容?

一周后.

因为没有人回答我--我用了很好的Spring解决方案(见下文)。

Spring比RestEasy客户端好吗?

代码语言:javascript
复制
InputStream inputStream = new FileInputStream(tempFile);
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setBufferRequestBody(false);
RestTemplate r = new RestTemplate(factory);

RequestCallback requestCallback = new RequestCallback() {
     @Override
     public void doWithRequest(ClientHttpRequest clientHttpRequest) throws IOException {
         List<org.springframework.http.MediaType> MEDIA_TYPES = Collections.unmodifiableList(Arrays.asList(org.springframework.http.MediaType.ALL));
         clientHttpRequest.getHeaders().setAccept(MEDIA_TYPES);
         OutputStream requestOutputStream = clientHttpRequest.getBody();
         try {
             int copiedBytes = IOUtils.copy(inputStream, requestOutputStream);
         } finally {
             IOUtils.closeQuietly(requestOutputStream);
         }
      }
};

ResponseExtractor<Response> responseExtractor = new ResponseExtractor<Response>() {
    @Override
    public Response extractData(ClientHttpResponse response) throws IOException {
        return Response.status(response.getRawStatusCode()).build();
    }
};

response = r.execute(url, HttpMethod.POST, requestCallback, responseExtractor);
EN

回答 1

Stack Overflow用户

发布于 2014-02-04 21:43:50

我想在Spring4.0.1中,您可以使用Apache和HttpComponentsClientHttpRequestFactory而不是SimpleClientHttpRequestFactory。这是最初的注释:SPR-10728

代码语言:javascript
复制
<bean id="restTemplateStreaming" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>
        <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
            <property name="bufferRequestBody" value="false" />
            <property name="httpClient">
                <bean class="com.spotfire.server.http.spring.HttpClientFactory">
                    <property name="clientBuilder">
                        <bean class="org.apache.http.impl.client.HttpClientBuilder">
                            <property name="connectionManager" ref="poolingHttpClientConnectionManager" />
                            <property name="redirectStrategy">
                                <bean class="org.apache.http.impl.client.LaxRedirectStrategy" />
                            </property>
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
    </constructor-arg>      
</bean>

注意,但是回调实现也会发生变化。您不再可以调用clientHttpRequest.getBody();相反,您必须使用稍微复杂的结构,如下所示:

代码语言:javascript
复制
class StreamingRequestCallback implements RequestCallback {

private final InputStream inputStream;

StreamingRequestCallback(InputStream inputStream) {
  this.inputStream = inputStream;
}

@Override
public void doWithRequest(final ClientHttpRequest request) throws IOException {
  request.getHeaders().add("Content-type", MediaType.APPLICATION_OCTET_STREAM_VALUE);

  ((StreamingHttpOutputMessage) request).setBody(new StreamingHttpOutputMessage.Body() {
    @Override
    public void writeTo(final OutputStream outputStream) throws IOException {
      IOUtils.copy(inputStream, outputStream);
    }
  });
}

};

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15951439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档