У меня есть конечная точка на моем сервере, которая должна возвращать файл json, созданный «на лету». Вот что я написал:
@GetMapping(value = "/{id}/json", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@ApiOperation(value = "Animal data as a json file", authorizations = {@Authorization(value = "JWT")})
public ResponseEntity<byte[]> getAnimalFile(@PathVariable("id") String id) throws JsonProcessingException {
Animal animal = animalService.getAnimal(id);
return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + animal.getId() + ".json").body(new ObjectMapper().writeValueAsBytes(animal));
}
@ApiOperation позволяет swagger включать эту операцию при создании моих клиентских библиотек. Однако это то, что ng-swagger-gen создает на стороне Angular:
/**
* @param id id
* @return OK
*/
getAnimalFileUsingGET(id: string): __Observable<string> {
return this.getAnimalFileUsingGETResponse(id).pipe(
__map(_r => _r.body as string)
);
}
Это не идеально, потому что я не могу загрузить таким образом файл, сгенерированный сервером. В моем компоненте у меня есть метод экспорта JSON:
exportJSON(): void {
this.animalService.getAnimalFileUsingGET(this.animal.id).subscribe(content => {
console.log(content); // prints the json content but I don't have the filename
});
}
Я смотрел другие ответы здесь, на SO, и они говорят, что используйте window.open(SERVER_ENDPOINT_HERE)
, но это не работает, потому что мои конечные точки используют аутентификацию (JWT) .
Есть ли способ:
- заставить ng-swagger-gen понять, что это файл с именем файла, и предоставить мне оба, когда я подпишусь на Observable, который он возвращает
- или обойти чванство и использовать Angular для загрузки файла, используя имя файла и аутентификацию, предоставленное сервером?
Идеальным решением было бы изменить что-то на стороне сервера, чтобы swagger генерировал правильный тип ответа, при котором я мог бы получить как файл, так и имя файла с сервера.