Программное создание и извлечение отчета BIRT из Web-Viewer

Я установил BIRT Web-Viewer на своем сервере и могу построить отчет с этим URL:

http://hostname:port/birt/run?__report=test.rptdesign

Теперь мне нужно программно вызвать этот URL из моего кода Java и получить результат как поток или файл.

Есть ли API для веб-Вьюера?


Если нет, Могу ли я просто вызвать URL-адрес и извлечь PDF?:

HttpClient httpClient = HttpClients.createDefault();
HttpGet postRequest = new HttpPost("http://hostname:port/birt/run");
List<NameValuePair> formData = new ArrayList<>();
formData.add(new BasicNameValuePair("__report", "test.rptdesign"));
HttpEntity entity = new UrlEncodedFormEntity(formData);
HttpResponse response = httpClient.execute(postRequest);

1 ответ

  1. Я обнаружил , что если я использую __formatпараметр со значениемpdf, ответом на запрос является содержимое PDF, которое именно то, что я хотел.

    Стандартный ответ-HTML, который будет возвращен со вторым запросом. Я уверен,что ответ должен быть получен с помощью сеансов.

    Редактировать:
    По запросу я отправлю код запроса. Я немного изменил его, потому что я использовал некоторые пользовательские классы для хранения конфигурации и отчета.

    public InputStream getReport() throws Exception {
      StringBuilder urlBuilder = new StringBuilder()
          .append("http://example.com:9080/contextRoot/run")
          .append("?__report=ReportDesign.rptdesign&__format=pdf");
    
      if (reportParameters != null) {
        for (Map.Entry<String, String> parameter : reportParameters.entrySet()) {
          String key = StringEscapeUtils.escapeHtml(parameter.getKey());
          String value = StringEscapeUtils.escapeHtml(parameter.getValue());
    
          urlBuilder.append('&')
              .append(key);
              .append('=');
              .append(value);
        }
      }
    
      URL requestUrl = new URL(burlBuilder.toString());
      HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
      connection.setRequestMethod("GET");
      connection.setDoInput(true);
      connection.connect();
    
      return connection.getInputStream();
    }
    

    У меня также был другой метод записи используемых данных в виде XML в файловую систему , прежде чем я позвонилrequestUrl.openConnection(), но я думаю, что это необходимо только в том случае, если вы используете очень динамические данные, как я сделал.