java - Manejar el accesorio en respuesta con RequestBuilder en GWT
pdf attachment (2)
Creo que en este caso no deberías usar una sola RequestBuilder
AJAX de 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).
Hay varias alternativas para lograr esto:
Si puede pasar sus datos en una solicitud GET (solo posible para un pequeño volumen de datos) puede crear la URL con los datos como parámetros GET y luego abrir una nueva ventana del navegador con Window.open () pasando la URL con datos.
Para grandes cantidades de datos, primero puede
RequestBuilder
sus datos conRequestBuilder
en el servidor para almacenar los datos temporalmente y en RequestCallback.onResponseReceived () abra una nueva ventana del navegador con una URL corta como la de arriba en la alternativa 1. En el lado del servidor, tiene que divida el servlet de generación de PDF en dos partes: un servlet de almacén de datos con método POST (es decir, almacenando 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 los elimina no necesita grandes parámetrosCree un formulario con 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 un nombre de destino, el navegador abre una nueva ventana o usa el marco especificado para manejar la respuesta.
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.
Los 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 pedirle 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?
En el lado del cliente, utilice un Ancla en lugar de un creador de solicitudes e invoque el servlet directamente utilizando Window.Location.replace (URL.encode (formActionUrl));