Cómo transmitir la respuesta del cuerpo con apache HttpClient

Hay una api necesito para realizar octet-streaming a partir de la cual no tiene una longitud. Es simplemente un flujo de datos en tiempo real. El problema que estoy teniendo es que cuando hago mi petición, que parece tratar a esperar para el final del contenido antes de la lectura de la información en el inputstream, sin embargo, es no ver el fin de los contenidos y timingout con NoHttpResponse excepción. A continuación es una versión simplificada de mi código:

private static HttpPost getPostRequest() {
    //Build uri
    URI uri = new URIBuilder()
            .setScheme("https")
            .setHost(entity.getStreamUrl())
            .setPath("/")
            .build();

    //Create http http
    HttpPost httpPost = new HttpPost(uri);

    String nvpsStr = "";
    Object myArray[] = nvps.toArray();
    for(int i = 0; i < myArray.length; i ++) {
        nvpsStr += myArray[i].toString();
        if(i < myArray.length - 1) {
            nvpsStr += "&";
        }
    }

    //Build http payload
    String request = nvpsStr + scv + streamRequest + "\n\n";
    //Attach http data
    httpPost.setEntity(new StringEntity(URLEncoder.encode(request,"UTF-8")));

    return httpPost;
}

//Where client is simply
//private static final CloseableHttpClient client = HttpClients.createDefault();
private static runPostRequest (HttpPost request) {
    CloseableHttpResponse response = client.execute(request);
    try {
        HttpEntity ent = response.getEntity();
        InputStream is = ent.getContent();
        DataInputStream dis = new DataInputStream(is);
        //Only stream the first 200 bytes
        for(int i = 0; i < 200; i++) {
            System.out.println(( (char)dis.readByte()));
        }

    } finally {
        response.close();
    }
}
Esto funciona muy bien para mí. Tal vez nos muestran su lado del servidor.
No tengo control de código server-side. Esto es sólo una 3ra parte de la api que estoy usando para el flujo de cotizaciones.
Nos puedes dar un ejemplo? He probado con un simple servlet que sería secuencia de unos pocos bytes cada pocos segundos y no he tenido problemas con la recepción de contenidos.
Por desgracia, la api yo uso me hizo firmar un acuerdo de confidencialidad. Probablemente voy a consultar con su personal sobre este tema. Gracias por la verificación de la validez de este código.
posibles duplicados de Apache HTTPClient Streaming de Solicitud HTTP POST?

OriginalEl autor Dr.Knowitall | 2014-12-09

1 Kommentar

  1. 7

    EDITAR 2

    Así, si u no se siente cómodo con los hilos de rosca/runnables/Controladores y no se siente cómodo con android AsyncTask, acabo de ir directamente a HttpUrlConnection (caída de todo el ejercicio con apacheHttpClient porque , básicamente, googl dice que HttpUrlConn apoyará arroyo había respuesta y funciona!)

    Puede no ser tan fácil instrumentar todos los detalles, como el dumping de los encabezados. Pero , con una normal transmitido Objeto de respuesta, creo que debería funcionar…. consulte edición de 3 de UrlConn ejemplo de código

    EndEdit2

    No está claro a partir de la pregunta ¿qué ‘stream’ protocolo se utiliza (progresiva dwnld | http streaming) O cómo son en realidad la gestión del streaming de la respuesta de su cliente.

    Recomendado para el volcado de los encabezados de la conexión para ver exactamente lo que el Cliente y el servidor se acordar??

    Suponiendo que u se APAGA el subproceso de interfaz de usuario (ya sea en asyncTask o en la devolución de llamada de parte de un Controlador de modo que usted puede tener para refactorizar un poco.

    Suponiendo http stream en uso con apache cliente 4.3.5+

    Si no hay ninguna longitud de las cabeceras de la respuesta, entonces usted está haciendo un ‘fragmentado’, la respuesta de Http 1.1, donde usted tiene que leer un búfer til u obtener un ‘el último fragmento de’ o decidir el CIERRE de la secuencia o de la Conexión:

    El servidor comienza a enviar (streaming) y el cliente debe controlar la entrada de corriente’ que se obtiene a partir de la respuesta http mediante el empleo de un buffer, como por la detallada apache notas sobre la producción de la entidad contenido.

    Que no recuerdo mano si socket-tiempo de espera de 30 segundos de adelantarse a un activo corriente? Recuerde que en apache, aparte existen ajustes en el constructor para el zócalo de tiempo de espera, y el tiempo de espera de LECTURA. No quiero socket para cerrar en u y, no quiero agotar el tiempo de espera en una lectura de secuencia de bytes disponibles, mientras que el servidor es la de proporcionar la respuesta.

    De todos modos, en el lado del cliente controlador sólo tiene que ser consciente de cómo la secuencia termina por la inspección de whats leer en el búfer…

    Si el protocolo es «continuar» & «fragmentada», a continuación, el controlador de respuesta en el cliente debe ser en una corriente controlador de bucle HASTA que se ve el ÚLTIMO FRAGMENTO de la http spec.

     response.getEntity().getContent() 

    debe dar la referencia que usted necesita para procesar la respuesta de la corriente hasta que ‘el último pedazo’…

    Creo que u debe leer aquí sobre cómo consumir en el buffer de la entidad donde más de una sola lectura se va a requerir para el viento en el último fragmento de » en la respuesta. Su otra razón por la que HttpUrlConn puede ser más fácil…

    Hacer un bucle que se encarga de búfer lee hasta el FINAL, marcada por los bytes de coincidencia de ‘el último pedazo’.

    A continuación, CLO, ya sea la corriente o CONN como por la detallada apache notas sobre el consumo de las entidades y reutilizables Conexiones.

    EDITAR código transmitido de respuesta en apache HttpClient

    En un ‘controlador de la devolución de llamada o en asyncTask

     request.execute();
    ...
    
     processStreamingEntity(response.getEntity());
     response.close();
    
    //implement your own wrapper as mentioned in apache docs
    
        private void processStreamingEntity(HttpEntity entity) throws IOException {
            InputStreamHttpEntityHC4 bufHttpEntity = new InputStreamHttpEntityHC4(entity);
            while not bufHttpEntity.LAST_CHUNK {
                handleResponse(bufHttpEntity.readLine())
    }

    EDITAR 3

    httpUrlConnection versión si u a ir por ese camino. ( utiliza un MessageHandler pero u puede consumir los bytes en lugar como este es de una transmisión de voz de ejemplo y las palabras del texto son enviados de vuelta a la interfaz de usuario aquí)

    private void openHttpsConnection(String urlStr, Handler mhandler) throws IOException {
        HttpsURLConnection httpConn = null;
        String line = null;
        try {
            URL url = new URL(urlStr);
            URLConnection urlConn = url.openConnection();               
            if (!(urlConn instanceof HttpsURLConnection)) {
                throw new IOException ("URL is not an Https URL");
            }               
            httpConn = (HttpsURLConnection)urlConn;
            httpConn.setAllowUserInteraction(false);
            httpConn.setInstanceFollowRedirects(true);
            httpConn.setRequestMethod("GET");
            httpConn.setReadTimeout(50 * 1000);
            BufferedReader is =
                    new BufferedReader(new InputStreamReader(httpConn.getInputStream()));                   
    
            while ((line = is.readLine( )) != null) {
    
                    Message msg = Message.obtain();
                    msg.what=1;  
                    msg.obj=line;                       
                    mhandler.sendMessage(msg);
    
            }               
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch( SocketTimeoutException e){
            e.printStackTrace();
        } catch (IOException e) {
    
            e.printStackTrace();
            Message msg = Message.obtain();
                msg.what=2;
                BufferedInputStream in = new BufferedInputStream(httpConn.getErrorStream());
    
                line =new String(readStream(in));
                msg.obj=line;
                mhandler.sendMessage(msg);
    
        }
        finally {httpConn.disconnect();}
    
    }
    Se supone que para ser http streaming que nunca he tratado con hasta recientemente. Yo estaba usando la URL.openStream() para recibir mis datos porque no tenía cerca de mi solicitud prematuramente… a diferencia de la httpclient de conexión.
    hmmm. a partir de su código se ve como un apache httpclient. La OMI con 4.3.5 + si establece los encabezados para ‘continuar’ y para fragmentada, pensé que el pseudocódigo en mi edición consumen la respuesta.entidad.
    Yo no lo he probado todavía, voy a echarle un vistazo. Sólo estoy esperando que admite el servidor de http 1.1 como usted dijo. He marcado esta la respuesta, porque, ciertamente, parece que lo que yo estaba buscando. Voy a volver a usted con los resultados. Gracias!
    Sí. Tenga en cuenta que en android, con corrientes de las entidades o, todavía puede existir alguna situación donde httpUrlconnection será mejor para el manejo de la secuencia ajustado. Me gustaría experimentar con apache para encontrar a la derecha ‘entidad’wrapper . Entonces, si no hay trabajo , de vuelta a httpUrlConn
    Nota. Curl POST con «trace-asci» ejecutar en muy corto arroyo le proporcionará un buen contexto en los detalles.

    OriginalEl autor Robert Rowntree

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea