У меня есть 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.