我正在尝试向 Jersey REST service
发出请求,该请求使用 PUT
方法接受 InputStream
作为实体 .
当我这样做时,Jersey客户端将 Content-Length
标头设置为0 .
REST服务要求 Content-Length
设置为流的实际大小(IE是文件的大小),但是,每当我尝试设置 Content-Length
时,客户端抛出:
org.apache.http.ProtocolException:Content-Length标头已存在
要注意 - 当我添加Content-Length标头时,不会抛出异常(此时,当 Jersey / Apache HTTPClient
稍后尝试添加 0
标头值时,此标头不会被抛出(我假设) .
如果它有任何帮助,请堆叠:
由org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909)org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient)中的org.apache.http.client.ClientProtocolException引起.java:827)org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:326)... 40更多引起:org.apache.http.ProtocolException:Content-Length标头已经出现在org .apache.http.protocol.RequestContent.process(RequestContent.java:96)org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:109)org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor) .java:176)org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:518)at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)...还有42个
所以,为什么 Jersey / Apache HTTP Client
将 Content-Length
标头设置为0的任何想法,以及为什么我无法覆盖 Content-Length
标头
我正在使用:
Jersey 2.4.1
与 ApacheConnector
提前致谢
将
1 回答
只是回答这个问题:
这是ApacheConnector的问题,对于内容的大小,它总是返回-1,确保永远不会设置此值 . (这是在getHttpEntity方法中硬编码的)
因此,如果需要content-length头,则必须重新实现ApacheConnector,如here所述,或者使用不同的连接器 .
我在Jersey jira报道过这个 .
https://java.net/jira/browse/JERSEY-2373