简体   繁体   English

Jersey http客户端:使用自定义Content-Length发出请求

[英]Jersey http client: put request with custom Content-Length

A want to put data from InputStream, but Jersey can not detect data length automatically and not preset Content-Length header. 想要从InputStream中放入数据,但Jersey无法自动检测数据长度而不预设Content-Length标头。

Response destinationResponse = responseWebTarget
                    .request()
                    .header(HEADER_X_AUTH_TOKEN, cmd.getOptionValue("dat"))
                    .put(Entity.entity(inputStream, MediaType.APPLICATION_OCTET_STREAM))

result is: 结果是:

INFO: 2 * Sending client request on thread main
2 > PUT http://192.168.1.10:8080/v1/AUTH_system/08138784704e2/test
2 > Content-Type: application/octet-stream
2 > X-Auth-Token: AUTH_tka2d071e5ba3e46e58cbbc3bdcc57bc70

I know data length and try to add header manually: 我知道数据长度并尝试手动添加标题:

            Object contentLength = sourceResponse.getHeaders().get(HTTP.CONTENT_LEN).get(0);
            Response destinationResponse = responseWebTarget
                    .request()
                    .header(HTTP.CONTENT_LEN, contentLength)
                    .header(HEADER_X_AUTH_TOKEN, cmd.getOptionValue("dat"))
                    .put(Entity.entity(is, MediaType.APPLICATION_OCTET_STREAM))

Now request looks fine, but Jersey throws exception: 现在请求看起来很好,但Jersey抛出异常:

INFO: 2 * Sending client request on thread main
2 > PUT http://192.168.1.10:8080/v1/AUTH_system/08138784704e2/test
2 > Content-Length: 2760033628
2 > Content-Type: application/octet-stream
2 > X-Auth-Token: AUTH_tka2d071e5ba3e46e58cbbc3bdcc57bc70

Exception in thread "main" javax.ws.rs.ProcessingException: org.apache.http.client.ClientProtocolException
    at org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:472)
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:254)
    at org.glassfish.jersey.client.JerseyInvocation.lambda$invoke$0(JerseyInvocation.java:729)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:205)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:390)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:728)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:421)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.put(JerseyInvocation.java:310)
    at copier.Main.main(Main.java:118)
Caused by: org.apache.http.client.ClientProtocolException
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:71)
    at org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:426)
    ... 10 more
Caused by: org.apache.http.ProtocolException: Content-Length header already present
    at org.apache.http.protocol.RequestContent.process(RequestContent.java:96)
    at org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:132)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:182)
    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)
    ... 12 more

How to do it correctly? 怎么做正确?

I replaced Jersey with Apache HC, 我用Apache HC替换了Jersey,

    Long contentLength = Long.parseLong(sourceResponse.getHeaders(HTTP.CONTENT_LEN)[0].getValue());
    HttpPut putRequest = new HttpPut(destinationUrl);
    putRequest.addHeader(HEADER_X_AUTH_TOKEN, cmd.getOptionValue("dat"));
    InputStreamEntity entity = new InputStreamEntity(is, contentLength, ContentType.APPLICATION_OCTET_STREAM);
    putRequest.setEntity(entity);

It has InputStream wrapper with the ability to specify the length. 它具有InputStream包装器,能够指定长度。

PS^ In addition, Chunked Transfer Encoding works correctly in Apache HC, but I could not turn it on in Jersey Client. PS ^此外,Chunked Transfer Encoding在Apache HC中正常工作,但我无法在Jersey Client中打开它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM