studio org importar example clase java android httpclient

importar - org apache http java



El encabezado Content-Length ya está presente (5)

Como lo señala igor.zh, este problema puede ocurrir si se usa la clase HttpComponentsMessageSender de Spring. Sin embargo, para ser más precisos, esto solo es un problema si está pasando su propia instancia de HttpClient al constructor HttpComponentsMessageSender; de lo contrario, el problema se maneja automáticamente.

A partir de spring-ws 2.1.4, la subclase HttpComponentsMessageSender.RemoveSoapHeadersInterceptor que se usa en el constructor predeterminado se hizo pública para solucionar este problema (consulte https://jira.spring.io/browse/SWS-835 ) y así puede ser utilizado en sus propias instancias de HttpClient en lugar de escribir su propia clase para hacerlo. También borra el encabezado HTTP.TRANSFER_ENCODING.

Utilice el método HttpClientBuilder.addInterceptorFirst para inyectar este interceptor en su propia instancia de HttpClient. Ejemplo a continuación utilizando el cableado XML Bean. Si alguien conoce una forma más concisa de construir la instancia HttpClient (aparte de escribir una clase de beans de fábrica), ¡soy todo lo que oí!

<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create"/> <bean id="interceptedHttpClientBuilder" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" ref="httpClientBuilder" /> <property name="targetMethod" value="addInterceptorFirst"> </property> <property name="arguments"> <list> <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender.RemoveSoapHeadersInterceptor"/> </list> </property> </bean> <bean id="httpClient" factory-bean="interceptedHttpClientBuilder" factory-method="build" /> <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> <constructor-arg ref="messageFactory"/> <property name="messageSender"> <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender"> <property name="httpClient" ref="httpClient"/> </bean> </property> </bean>

Alternativamente, si puede, simplemente permita que HttpComponentsMessageSender construya su propia instancia de HttpClient en lugar de pasarle una. Nota menor sobre esto: a partir de spring-ws 2.2.0-RELEASE, el constructor predeterminado para HttpComponentsMessageSender continúa usando la clase DefaultHttpClient, que ahora está en desuso. Esperemos que esto se aborde en un futuro lanzamiento.

Estoy usando el Apache HttpClient (4.1) incluido en Android para ejecutar un HttpPut. He verificado que solo tengo 1 encabezado de longitud de contenido. Sin embargo, cada vez que envío la solicitud, recibo una excepción de protocolo sobre el encabezado Content-Length ya especificado.

HttpClient client = new DefaultHttpClient(); putMethod = new HttpPut(url + encodedFileName); putMethod.addHeader(..) //<-once for each header putMethod.setEntity(new ByteArrayEntity(data)); client.execute(putMethod); //throws Exception

Causado por: org.apache.http.ProtocolException: el encabezado Content-Length ya está presente en org.apache.http.protocol.RequestContent.process (RequestContent.java:70) en org.apache.http.protocol.BasicHttpProcessor.process (BasicHttpococol) .java: 290)

¿Algunas ideas?


Eso me sucede cuando utilicé http://docs.spring.io/spring-ws/site/apidocs/org/springframework/ws/transport/http/HttpComponentsMessageSender.html como remitente de mensajes de Spring WebService. En ese caso, las cosas como HttpPut o HttpRequest no son fácilmente accesibles, por lo tanto, al construir HttpClient con HttpClientBuilder, terminé insertando un HttpRequestInterceptor delante del culpable RequestContent:

private static class ContentLengthHeaderRemover implements HttpRequestInterceptor{ @Override public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { request.removeHeaders(HTTP.CONTENT_LEN);// fighting org.apache.http.protocol.RequestContent''s ProtocolException("Content-Length header already present"); } } ... HttpClientBuilder httpClientBuilder = HttpClients.custom(); httpClientBuilder.addInterceptorFirst(new CcontentLengthHeaderRemover());


No he usado HttpClient, pero sospecho que el problema es que putMethod.setEntity(...) está suministrando implícitamente una longitud de contenido y también lo está configurando explícitamente a través de una de las putMethod.addHeader(...) .



La respuesta de John Rix tiene la idea correcta. Así es como lo haces con Java simple:

HttpClient client = HttpClients.custom() .addInterceptorFirst(new RemoveSoapHeadersInterceptor()) .build();