Доступ к внутренним модулям, определяющим параметры API в ng-swagger-gen - PullRequest
1 голос
/ 21 апреля 2020

Я относительно новичок в angular и набираю скрипт. Я разрабатываю новый фреймворк spring / angular для использования в моей компании и использую проект ng-swagger-gen для генерации angular клиента из контроллеров пружин.

Моя проблема заключается в том, что когда я определяю более одного параметра для контроллера, ng-swagger-gen создает интерфейс для их хранения, который я не могу понять, как импортировать из потребляющего компонента.

Ниже приведен сгенерированный API

import { Injectable } from '@angular/core';
import { HttpClient, HttpRequest, HttpResponse, HttpHeaders } from '@angular/common/http';
import { BaseService as __BaseService } from '../base-service';
import { ApiConfiguration as __Configuration } from '../api-configuration';
import { StrictHttpResponse as __StrictHttpResponse } from '../strict-http-response';
import { Observable as __Observable } from 'rxjs';
import { map as __map, filter as __filter } from 'rxjs/operators';

import { VehicleBean } from '../models/vehicle-bean';
@Injectable({
  providedIn: 'root',
})
class ApiService extends __BaseService {
  static readonly helloPath = '/hello/sayhi';
  static readonly findVehiclePath = '/vehicle/find';
  static readonly listVehiclesPath = '/vehicle/list';

  constructor(
    config: __Configuration,
    http: HttpClient
  ) {
    super(config, http);
  }

  /**
   * @param toWhom undefined
   * @return successful operation
   */
  helloResponse(toWhom: string): __Observable<__StrictHttpResponse<string>> {
    let __params = this.newParams();
    let __headers = new HttpHeaders();
    let __body: any = null;
    if (toWhom != null) __params = __params.set('toWhom', toWhom.toString());
    let req = new HttpRequest<any>(
      'POST',
      this.rootUrl + `/hello/sayhi`,
      __body,
      {
        headers: __headers,
        params: __params,
        responseType: 'text'
      });

    return this.http.request<any>(req).pipe(
      __filter(_r => _r instanceof HttpResponse),
      __map((_r) => {
        return _r as __StrictHttpResponse<string>;
      })
    );
  }
  /**
   * @param toWhom undefined
   * @return successful operation
   */
  hello(toWhom: string): __Observable<string> {
    return this.helloResponse(toWhom).pipe(
      __map(_r => _r.body as string)
    );
  }

  /**
   * @return successful operation
   */
  findVehicleResponse(): __Observable<__StrictHttpResponse<VehicleBean>> {
    let __params = this.newParams();
    let __headers = new HttpHeaders();
    let __body: any = null;
    let req = new HttpRequest<any>(
      'GET',
      this.rootUrl + `/vehicle/find`,
      __body,
      {
        headers: __headers,
        params: __params,
        responseType: 'json'
      });

    return this.http.request<any>(req).pipe(
      __filter(_r => _r instanceof HttpResponse),
      __map((_r) => {
        return _r as __StrictHttpResponse<VehicleBean>;
      })
    );
  }
  /**
   * @return successful operation
   */
  findVehicle(): __Observable<VehicleBean> {
    return this.findVehicleResponse().pipe(
      __map(_r => _r.body as VehicleBean)
    );
  }

  /**
   * @param params The `ApiService.ListVehiclesParams` containing the following parameters:
   *
   * - `offset`:
   *
   * - `howMany`:
   *
   * @return successful operation
   */
  listVehiclesResponse(params: ApiService.ListVehiclesParams): __Observable<__StrictHttpResponse<Array<VehicleBean>>> {
    let __params = this.newParams();
    let __headers = new HttpHeaders();
    let __body: any = null;
    if (params.offset != null) __params = __params.set('offset', params.offset.toString());
    if (params.howMany != null) __params = __params.set('howMany', params.howMany.toString());
    let req = new HttpRequest<any>(
      'GET',
      this.rootUrl + `/vehicle/list`,
      __body,
      {
        headers: __headers,
        params: __params,
        responseType: 'json'
      });

    return this.http.request<any>(req).pipe(
      __filter(_r => _r instanceof HttpResponse),
      __map((_r) => {
        return _r as __StrictHttpResponse<Array<VehicleBean>>;
      })
    );
  }
  /**
   * @param params The `ApiService.ListVehiclesParams` containing the following parameters:
   *
   * - `offset`:
   *
   * - `howMany`:
   *
   * @return successful operation
   */
  listVehicles(params: ApiService.ListVehiclesParams): __Observable<Array<VehicleBean>> {
    return this.listVehiclesResponse(params).pipe(
      __map(_r => _r.body as Array<VehicleBean>)
    );
  }
}

module ApiService {

  /**
   * Parameters for listVehicles
   */
  export interface ListVehiclesParams {
    offset: number;
    howMany: number;
  }
}

export { ApiService }

который я упаковал в библиотеку po c -client-v2. Я могу импортировать и внедрить сам ApiService следующим образом.

import {ApiService} from 'poc-client-v2';
import {ActivatedRoute, Router} from '@angular/router';
import {FormGroup, FormControl, Validators, FormBuilder} from '@angular/forms';
import {debounceTime} from 'rxjs/operators'; 
import {VehicleBean} from  'poc-client-v2/api/models/vehicle-bean';


@Component({
  selector: 'app-vehicle-list-example',
  templateUrl: './vehicle-list-example.component.html',
  styleUrls: ['./vehicle-list-example.component.css']
})


export class VehicleListExampleComponent implements OnInit {


  filterGroup: FormGroup;
  vehicles : VehicleBean[];

  constructor(private route: ActivatedRoute, private router: Router, private apiService: ApiService) {
    this.filterGroup = this.createFormGroup();

  }

  ngOnInit() {
     console.log('user list init: ');

    this.filterGroup.get('criteria').valueChanges.pipe( debounceTime(1000) ).subscribe(
      field=> { 
        console.log('criteria changed: ' + field);
       // Can't instantiate a new ListVehiclesParams here without the proper import
       // this.apiService.listVehicles(new ListVehiclesParams(0,20)).subscribe(data => {this.vehicles=data;})
      } 
    );
  }

   createFormGroup() {
    return new FormGroup({
      criteria: new FormControl('')
    });
  }
}

, но я не могу понять, как импортировать интерфейс ListVehiclesParams в модуль ApiService, определенный в нижней части сгенерированного ApiService, чтобы я мог вызвать метод listVehicles , Может кто-нибудь показать мне, чего мне не хватает?

Ответы [ 2 ]

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

Чтобы ответить на основной вопрос, для доступа к ListVehiclesParams вы должны иметь возможность использовать ApiService.ListVehiclesParams.

Однако, если бы вы это сделали, вы бы заметили ошибку из-за того, что что вы не можете создать экземпляр интерфейса таким образом в машинописи. new ListVehiclesParams(0,20) - это синтаксис, используемый для классов, но вы создаете экземпляры интерфейсов как простые объекты (что вы и сделали в ответе), например:

const params: ApiService.ListVehicleParams = {
   offset: 10,
   howMany: 10,
};
this.apiService.listVehicles(params).subscribe(data => {this.vehicles=data;})

Более подробную информацию об этом можно найти в Страница Typescript на интерфейсах

Однако , несмотря на все сказанное, одной из самых сильных сторон машинописи является ее способность выводить типы и обеспечивать безопасность этих предполагаемых типов. , Во многих случаях исключение типа и просто создание экземпляра встроенного интерфейса является наиболее кратким и читаемым решением, поэтому я думаю, что способ, которым вы это сделали, великолепен. В вашем решении, которое использовало this.apiService.listVehicles({offset: 10, howMany: 10}), за кулисами typcript точно знает, какой тип должен быть передан этому методу. Из-за этого будет выдано сообщение об ошибке, если вы передадите что-то, что не соответствует определению интерфейса, например, опечатку типа {ofset: 10, howmany: 10}.

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

ответ заключался не в том, чтобы импортировать его вообще ... а в том, чтобы просто реализовать отформатированный объект json с правильными именами параметров.

this.apiService.listVehicles({offset:10,howMany:10}).subscribe(data => {this.vehicles=data;})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...