Обрабатывать вложения в ответ с RequestBuilder в GWT - PullRequest
10 голосов
/ 02 сентября 2011

Я делаю 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        
}

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

Ответы [ 2 ]

17 голосов
/ 02 сентября 2011

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

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

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

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

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

1 голос
/ 02 сентября 2011

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

...