отправить обратно сгенерированный массив байтов JasperReports из Spring в node.js -> angular - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть AngularJS Controller, который (должен) загружать PDF из Java Microservice.Его ответ - массив байтов.

Я получаю возвращаемый PDF, но он просто пуст.Я полагаю, что мне чего-то не хватает, особенно в серверной части (node.js) в отношении правильного возврата этого массива байтов.

Вот так:

Этот контроллер имеет generatePDF () метод, который должен быть вызван, и в конце он должен загрузить PDF:

$scope.generateContractPDF = function () {
    $scope.contractDetails = {
        farmName: $scope.selectedInvestment.location.farmName,
        farmAddress: $scope.selectedInvestment.location.farmAddress
    };

    InvestmentService.generateContractPDF($scope.contractDetails)
        .then(function (response) {
            console.log(response.data);

            var a = document.createElement("a");

            var file = new Blob([response.data], {
                type: 'application/pdf;charset=utf-8'
            });

            var fileURL = URL.createObjectURL(file);

            a.href = fileURL;
            a.target = '_blank';
            a.download = fileName + '.pdf';
            document.body.appendChild(a);
            a.click();
        });
};

он отправляется в службу AngularJS, которая позже вызовет внутренний контроллер (в файле node.js / express), ответственный заit:

generateContractPDF: function (contractDetails) {
    return $http.post("/mywebsite/investment/generate-contract-pdf", contractDetails, '', {responseType: 'arraybuffer'});
}

Это внутренний контроллер, отвечающий за POST-запрос:

app.post("/mywebsite/investment/generate-contract-pdf", tokenAuthenticator, function (req, res) {
    console.log(req.body);

    InvestmentService.generateContractPDF(req.body)
        .then(function (data) {
            res.set('Content-Type', 'application/pdf;charset=UTF-8');
            res.send(data);
        }).catch(function (err) {
            res.status(404).json(err);
        });
});

Затем он переходит к серверной службе, отвечающей за фактическую генерацию JasperReports PDF вПриложение Spring Boot:

generateContractPDF: function (contractDetails) {
        const url = "http://localhost:8080/generate-contract";

        // pass a JSON "investment" as argument.
        // It will be received by the Java Microservice as parameter.
        return new Promise((resolve, reject) => {
            request.post(url, { "json": contractDetails }, (error, response, body) => {
                resolve(body);
            });
        });
    },

Это микросервис Spring Boot, который возвращает массив байтов в качестве ответа.

@PostMapping(path = "/generate-contract", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<byte[]> report(
    @RequestBody Contract contract) {

    log.info("testing inside Java controller");

    Map <String, Object> params = new HashMap<>();

    String farmImageURL = "image-url-here.png";

    params.put("farmName", contract.getFarmName());
    params.put("farmImageURL", farmImageURL);

    byte[] bytes = reportService.generatePDFReport("paiwi-contract", params);

    return ResponseEntity
        .ok()
        .header("Content-Type", "application/pdf; charset=UTF-8")
        .header("Content-Disposition", "inline; filename=\"" + contract.getFarmName() + ".pdf\"")
        .body(bytes);
}

Как правильно отправить его обратно на узел / экспресс до AngularJS для загрузки?Потому что когда я делаю POST-запрос POSTman непосредственно к микросервису, я получаю правильный PDF.

...