2011-09-02 8 views
10

Estoy haciendo una solicitud HTTP POST desde GWT Client a un HTTPServlet. Este servlet está creando un archivo PDF a partir del contenido de solicitud y escribiéndolo en la secuencia de respuesta.Agarre adjunto en respuesta con RequestBuilder en GWT

encabezados de la secuencia de respuesta son:

Content-Disposition: attachment; filename=report.pdf 

quiero abrir este PDF en una nueva ventana del navegador del usuario o le pedirá que lo descargue.

import com.google.gwt.http.client.*; 
... 

String url = "http://www.myserver.com/getData?type=3"; 
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, URL.encode(url)); 

try { 
    Request request = builder.sendRequest(data, new RequestCallback() { 
    public void onError(Request request, Throwable exception) { 
     // Couldn't connect to server (could be timeout, SOP violation, etc.)  
    } 

    public void onResponseReceived(Request request, Response response) { 
     if (200 == response.getStatusCode()) { 
      // Process the response in response.getText() 
      // Window.open(url, "_blank", ""); 
     } else { 
     // Handle the error. Can get the status text from response.getStatusText() 
     } 
    }  
    }); 
} catch (RequestException e) { 
    // Couldn't connect to server   
} 

¿Cómo debo manejar la respuesta en onResponseRecibved?

Respuesta

17

Creo que en este caso no debe usar una sola llamada AJAX RequestBuilder. Puede confiar en el comportamiento predeterminado del navegador invocando una llamada normal y dejando que el navegador maneje la respuesta de PDF (mostrándola con un plugin de visor de PDF o abriendo un diálogo Guardar).

Existen varias alternativas para lograr este:

  1. Si usted puede pasar sus datos en una solicitud GET (sólo es posible para una pequeña cantidad de datos) puede crear la URL con los datos como parámetros GET y luego abra una nueva ventana del navegador con Window.open() pasando la URL con los datos.

  2. Para cantidades mayores de datos por primera vez pueden publicar sus datos con RequestBuilder al servidor para almacenar los datos y provisoriamente en RequestCallback.onResponseReceived() abrir una nueva ventana del navegador con una URL corta como la de arriba en la alternativa 1. En el servidor que tiene dividir el servlet de generación de PDF en dos partes: un servlet del almacén de datos con método POST (es decir, almacenar los datos en la sesión web) y un servlet de PDF con método GET, que saca los datos de la sesión (y los borra) y no necesita grandes parámetros

  3. Cree un formulario con el método POST, campos ocultos para sus datos y la URL del servlet de generación de PDF. Complete los campos ocultos con sus datos y envíe el formulario de forma programática (es decir, FormPanel.submit()). Si crea su FormPanel con target name, el navegador abre una nueva ventana o usa el marco especificado para manejar la respuesta.

1

En el lado del cliente, use un Ancla en lugar de un generador de solicitudes e invoque el servlet directamente utilizando Window.Location.replace (URL.encode (formActionUrl));