Обрабатывать привязку в ответ на RequestBuilder в GWT

Я делаю запрос HTTP POST от клиента GWT к HTTPServlet. Этот сервлет создает файл PDF из содержимого запроса и записывает его в поток ответов.

Заголовки потока ответов:

Content-Disposition: attachment; filename=report.pdf

Я хочу открыть этот PDF файл в новом окне браузера пользователя или попросить его загрузить его.

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        
}

Как мне обрабатывать ответ в onResponseRecieved?

Ответ 1

Думаю, в этом случае вы не должны использовать один вызов RequestBuilder AJAX. Вы можете полагаться на поведение браузера по умолчанию, вызывая обычный вызов и позволяя браузеру обрабатывать ответ PDF (отображая его с помощью плагина просмотра PDF или открывая диалог "Сохранить" ).

Существует несколько альтернатив для достижения этого:

  • Если вы можете передавать свои данные в запросе GET (возможно только для небольшого тома данных), вы можете создать URL-адрес с данными как параметры GET, а затем открыть новое окно браузера с помощью Window.open(), передающий URL с данными.

  • Для больших объемов данных вы можете сначала отправить свои данные с помощью RequestBuilder на сервер для хранения данных во времени и в RequestCallback.onResponseReceived( ) откройте новое окно браузера с коротким URL-адресом, как указано выше, в альтернативе 1. На стороне сервера вам необходимо разделить сервлет создания PDF на две части: сервлет хранилища данных с методом POST (т.е. сохранение данных в веб-сеанс) и сервлет рендеринга PDF с методом GET, который выводит данные из сеанса (и удаляет его) и не требует больших параметров.

  • Создайте форму с методом POST, скрытые поля для ваших данных и URL-адрес сервлета для генерации PDF. Заполните скрытые поля вашими данными и введите форму программно (т.е. FormPanel.submit()). Если вы создаете FormPanel с целевым именем, браузер открывает новое окно или использует указанный фрейм для обработки ответа.

Ответ 2

На стороне клиента используйте Якорь вместо конструктора запросов и вызовите сервлет непосредственно с помощью Window.Location.replace(URL.encode(formActionUrl));