Estoy usando apache común httpclient 4.3.3 para hacer la solicitud http 1.0. Aquí es cómo hacer la solicitud

HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(url);
post.setProtocolVersion(new ProtocolVersion("HTTP", 1, 0));

 //trying to remove default headers but it doesn't work
post.removeHeaders("User-Agent");
post.removeHeaders("Accept-Encoding");
post.removeHeaders("Connection");

post.setEntity(new ByteArrayEntity(ba) );

HttpResponse response = client.execute(post);

Sin embargo, puedo ver que hay otras cabeceras automáticamente añadido a mi solicitud para el servidor como

Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.3.3 (java 1.5)
Accept-Encoding: gzip,deflate

¿Cómo puedo saber httpclient no incluir a todas las otras cabeceras? Traté de quitar los encabezados con el post.removeHeaders(xxxx) pero no funciona. ¿Me puede mostrar cómo?

Gracias,

OriginalEl autor Sean Nguyen | 2014-04-25

4 Comentarios

  1. 10

    Si usted llama HttpClientBuilder.create(), usted tendrá una httpClientBuilder.
    Y httpClientBuilder tiene un montón de configuración por defecto de los encabezados y esto será utilizado para hacer intercepters( ex: RequestAcceptEncoding ).

    Por ejemplo, RequestAcceptEncoding, que implementa HttpRequestInterceptor, hace Accept-Encoding: gzip,deflate encabezado cuando HttpProcessor.proceso de() se invoca.
    Y httpProcessor.proceso de() se invoca justo antes de invocar
    final CloseableHttpResponse response = this.requestExecutor.execute(route, request, context, execAware);

    Se puede ver este código en org.apache.http.impl.execchain.ProtocolExec de httpclient-4.3.6 línea 193.

    Si quieres quitar Accept-Encoding: gzip,deflate, llamada HttpClientBuilder.disableContentCompression() como el de abajo.

    HttpClient client = HttpClientBuilder.create().disableContentCompression().build();

    En resumen, HttpClientBuilder tiene un montón de banderas para desactivar/activar la HttpRequestInterceptor. Si usted habilitar/deshabilitar los HttpRequestInterceptor, puede excluir/incluir encabezados predeterminados.

    Lo siento por mi pobre inglés, y espero que entiendas a lo que me refiero.

    OriginalEl autor Cheemin

  2. 6
    CloseableHttpClient hc = HttpClients.custom()
            .setHttpProcessor(HttpProcessorBuilder.create().build())
            .build();

    El fragmento de código anterior muestra cómo crear un HttpClient instancia con un vacío (no-op) protocolo de procesador, lo que garantiza que no hay encabezados de solicitud siempre será añadido a los mensajes salientes ejecutado por dicho cliente

    Una explicación de este código sería bueno.
    No estoy seguro de qué tipo de explicaciones adicionales, se espera aquí. El fragmento de código anterior muestra cómo crear un HttpClient instancia con un vacío (no-op) protocolo de procesador, lo que garantiza que no hay encabezados de solicitud siempre será añadido a los mensajes salientes ejecutado por dicho cliente
    este método de quitar todos los encabezados! usted debe config esta

    OriginalEl autor oleg

  3. 2

    Usted desea hacer su ‘limpieza’ en la final, después de HttpClient se realiza la modificación de la solicitud. Usted puede hacer esto llamando a addInterceptorLast en HttpClientBuilder como a continuación.

    HttpClient client = HttpClientBuilder.create().addInterceptorLast( 
                            new HttpRequestInterceptor() {
                                public void process(HttpRequest request, HttpContext context){
                                    request.removeHeaders("Host");
                                    request.removeHeaders("Connection");
                                }
                            }   
                    ).build();

    Puedo crear una clase anónima implementación de HttpRequestInterceptor. Tomar cualquier encabezado de las modificaciones que deben hacerse antes de que la solicitud se envía, y los puso en el método de proceso.

    OriginalEl autor Brian G

  4. 0

    Creo que se podría agregar que la implementación de HttpRequestInterceptor con client.addRequestInterceptor()


    o (mejor)

    quitar todos los interceptores que agregar encabezados de la petición (RequestUserAgent, RequestDefaultHeaders, RequestClientConnControl, RequestAcceptEncoding, …).

    De la eliminación de ellos también es fácil:

    client.removeRequestInterceptorByClass(RequestAcceptEncoding.class);
    no veo el método removeRequestInterceptorByClass(xxxx) para HttpClient. Donde puedo establecer que el método?
    hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/…, Pero yo vi toda la API está obsoleto para 4.3

    OriginalEl autor Stephan

Dejar respuesta

Please enter your comment!
Please enter your name here