Angular 8 HttpClient GET игнорирует responseType: «blob» из возвратов API swagger {} - PullRequest
0 голосов
/ 27 апреля 2020

Указана служба API в Swagger 2.0, например, так:

 /example/my-file:
    get:
      summary: Get this file
      tags:
        - MyFile
      produces:
        - application/octet-stream
      responses:
        200:
          description: OK
          schema:
            type: file
        400:
          $ref: "#/responses/badRequest"
        404:
          $ref: "#/responses/notFound"
        500:
          $ref: "#/responses/internalServerError"

Реализована и может выполнять GET-запрос Postman, который корректно возвращает содержимое файла. Я использовал ng-swagger-gen для генерации вызова службы angular:

getExampleFileResponse(params: ExampleService.GetExampleFileParams): __Observable<__StrictHttpResponse<Blob>> {
    let __params = this.newParams();
    let __headers = new HttpHeaders();
    let __body: any = null;


    let req = new HttpRequest<any>(
      'GET',
      this.rootUrl + `/example/my-file`,
      __body,
      {
        headers: __headers,
        params: __params,
        responseType: 'blob'
      });

    return this.http.request<any>(req).pipe(
      __filter(_r => _r instanceof HttpResponse),
      __map((_r) => {
        return _r as __StrictHttpResponse<Blob>;
      })
    );
  }


  getExampleFile(params: ExampleService.GetExampleFileParams): __Observable<Blob> {
    return this.getExampleFileResponse(params).pipe(
      tap(_r => console.log(_r)),
      __map(_r => _r.body as Blob)
    );
  }

Когда я звоню с клиента angular:

   this.ExampleService.getExampleFile(param)
    .subscribe((f) => {
      saveAs(f, 'example.txt')
    });

, я получаю BLOB-объект, состоящий из 3 байта: {} \ n Не содержимое файла. Кажется, что-то в сервисе работает неправильно. Если я добавлю tap () в службу в ответе, то увижу, что ответ доставляет BLOB-объект с этими тремя байтами и типом контента: application / json, а не application / octet-stream, который я указал в API .

1 Ответ

0 голосов
/ 27 апреля 2020

ОК. Отсутствие информации: мы использовали перехватчик для ввода токена аутентификации. Нам нужно было добавить и принять: application / json, application / octet-stream, / ', чтобы файловый BLOB-объект делал это из GET. Документ angular указывает, что по умолчанию для HttpClient.get () возвращается значение JSON. Нам просто нужно было указать принятые типы возврата.

...