2011-09-02 7 views
10

Sto effettuando una richiesta HTTP POST dal client GWT a un HTTPServlet. Questo servlet sta creando un file PDF dal contenuto della richiesta e lo scrive nel flusso di risposta.Gestire l'allegato in risposta con RequestBuilder in GWT

intestazioni del flusso di risposta sono:

Content-Disposition: attachment; filename=report.pdf 

voglio aprire questo PDF in una nuova finestra del browser dell'utente o gli chiederà di scaricarlo.

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   
} 

Come devo gestire la risposta in onResponseRecieved?

risposta

17

Penso che in questo caso non si debba usare una sola chiamata AJAX RequestBuilder. È possibile fare affidamento sul comportamento predefinito del browser richiamando una normale chiamata e lasciando che il browser gestisca la risposta PDF (visualizzandola con un plug-in del visualizzatore PDF o aprendo una finestra di dialogo Salva).

Ci sono diverse alternative per raggiungere questo:

  1. Se riesci a passare i dati in una richiesta GET (possibile solo per un volume di dati piccolo) è possibile creare l'URL con i dati come parametri GET e quindi apri una nuova finestra del browser con Window.open() passando l'URL con i dati.

  2. Per grandi quantità di dati che è possibile pubblicare il tuo primo dati con RequestBuilder al server per memorizzare i dati temporaneamente e in RequestCallback.onResponseReceived() aprire una nuova finestra del browser con un URL breve come sopra in alternativa 1. Sul lato server si dispone per dividere il servlet di generazione PDF in due parti: un servlet dell'archivio dati con metodo POST (ovvero l'archiviazione dei dati nella sessione Web) e un servlet di rendering PDF con metodo GET, che estrae i dati dalla sessione (e li elimina) e non ha bisogno di grandi parametri

  3. Creare un modulo con metodo POST, campi nascosti per i dati e l'URL del servlet di generazione PDF. Riempi i campi nascosti con i tuoi dati e invia il modulo a livello di programmazione (ad esempio FormPanel.submit()). Se crei il tuo FormPanel con un target name il browser apre una nuova finestra o usa il frame specificato per gestire la risposta.

1

Sul lato client, utilizzare un ancoraggio anziché un generatore di richieste e richiamare direttamente il servlet utilizzando Window.Location.replace (URL.encode (formActionUrl));