Problema de longitud de contenido HTTPClient de Apache
-
14-11-2019 - |
Pregunta
Estoy tratando de publicar a algunos JSON a un servicio de descanso utilizando Apache HttpClient.Sin embargo, obtengo este error:
Exception in thread "main" org.apache.http.ProtocolException: Content-Length header already present
UsernamePasswordCredentials defaultcreds = new UsernamePasswordCredentials(USER,
PASS);
HttpHost targetHost = new HttpHost("localhost", 8080, "http");
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
new UsernamePasswordCredentials(USER, PASS));
HttpPost httpPost = new HttpPost(urlSuffix) {};
JSONObject holder = new JSONObject();
holder.put("name", "this is a folder");
StringEntity se = new StringEntity(holder.toString());
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
httpPost.setEntity(se);
HttpResponse resp = httpclient.execute(targetHost,httpPost);
System.out.println("Resp->" + resp.getStatusLine().getStatusCode());
He leído porque ya estoy configurando la longitud del contenido dos veces, pero no estoy seguro de cómo solucionarlo.
Solución
Tu código funciona bien para mí usando httclient 4.1.1.¿Qué versión está utilizando?
Si está seguro de que no está configurando el encabezado de Content-Length
por segunda vez en su código (es decir, el código publicado anteriormente es exactamente el código que está ejecutando), tal vez podría intentarloActualización de la última versión de la biblioteca HTTPClient.Posiblemente podría experimentar un error oscuro como httpclient-795 .
Otros consejos
Me doy cuenta de que ha sido un tiempo, ya que se ha preguntado esta pregunta, pero aquí está la solución que encontré: En caso de que no pueda cambiar los frascos del cliente, la solución que utilicé es:
httpClient.removeRequestInterceptorByClass(org.apache.http.protocol.RequestContent.class);
El cliente HTTP de Apache tiene un interceptor de solicitud que calcula automáticamente y agrega el encabezado de la longitud del contenido, que también realiza la biblioteca WS. Con el código anterior, este interceptor está excluido del procesamiento de solicitud.