Angular 5+ использует данные из основного веб-интерфейса asp.net - PullRequest
0 голосов
/ 17 мая 2018

У меня проблема с потреблением данных из ASP.NET Core 2.0 Web API с Angular 5 +.

Вот шаги, которые я сделал:

  1. Я построил ASP.NET Core 2.0 WebAPI и развернул его на сервере.Я могу без проблем получать данные от почтальона или чванца.
  2. Затем я создал с помощью NSwagStudio клиентские классы службы TypeScript для моего приложения углового интерфейса.

Теперь проблема: я могусделайте запрос к wep api из приложения внешнего интерфейса, и я также получаю правильные данные в формате JSON.Но в то время как процесс сопоставления с объектом poco в сгенерированном классе обслуживания клиента, что-то не работает.Я всегда получаю объект с пустыми атрибутами.

Вот мой код:

product.service.ts
export class ProductService {
  private http: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> };
  private baseUrl: string;
  protected jsonParseReviver: (key: string, value: any) => any = undefined;

  constructor() {
      this.http = <any>window;
      this.baseUrl =  "http://testweb01/FurnitureContractWebAPI";
  }

  getByProductId(productId: string): Promise<Product[]> {

      let url_ = this.baseUrl + "/api/Product/GetById?";
      if (productId === undefined)
          throw new Error("The parameter 'productId' must be defined.");
      else
          url_ += "productId=" + encodeURIComponent("" + productId) + "&"; 
      url_ = url_.replace(/[?&]$/, "");

      let options_ = <RequestInit>{
          method: "GET",
          headers: {
              "Content-Type": "application/json", 
              "Accept": "application/json"
          }
      };

      return this.http.fetch(url_, options_).then((_response: Response) => {
          return this.processGetByProductId(_response);
      });
  }

protected processGetByProductId(response: Response): Promise<Product[]> {
      const status = response.status;
      let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
      if (status === 200) {
          return response.text().then((_responseText) => {
          let result200: any = null;
          let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
          if (resultData200 && resultData200.constructor === Array) {
              result200 = [];
              for (let item of resultData200) {
                var x = Product.fromJS(item);
                //console.log(x);
                result200.push(Product.fromJS(item));
              }

          }
          //console.log(result200);
          return result200;
          });
      } else if (status !== 200 && status !== 204) {
          return response.text().then((_responseText) => {
          return throwException("An unexpected server error occurred.", status, _responseText, _headers);
          });
      }
      return Promise.resolve<Product[]>(<any>null);
  }

А вот методы из класса Product:

init(data?: any) {
    console.log(data);
      if (data) {
          this.productId = data["ProductId"];
          this.productNameDe = data["ProductNameDe"];
          this.productNameFr = data["ProductNameFr"];
          this.productNameIt = data["ProductNameIt"];
          this.supplierProductId = data["SupplierProductId"];
          this.supplierProductVarId = data["SupplierProductVarId"];
          this.supplierProductVarName = data["SupplierProductVarName"];
          this.supplierId = data["SupplierId"];
          this.supplierName = data["SupplierName"];
          this.additionalText = data["AdditionalText"];
          this.installationCost = data["InstallationCost"];
          this.deliveryCost = data["DeliveryCost"];
          this.sectionId = data["SectionId"];
          this.categorieId = data["CategorieId"];
          this.price = data["Price"];
          this.ean = data["Ean"];
          this.brand = data["Brand"];
          this.modifiedDate = data["ModifiedDate"] ? new Date(data["ModifiedDate"].toString()) : <any>undefined;
          this.categorie = data["Categorie"] ? ProductCategory.fromJS(data["Categorie"]) : <any>undefined;
          this.section = data["Section"] ? ProductSection.fromJS(data["Section"]) : <any>undefined;
      }
  }

  static fromJS(data: any): Product {
      data = typeof data === 'object' ? data : {};
      let result = new Product();
      result.init(data);
      return result;
  }

В init () метод, когда я смотрю на data , он содержит все нужные мне значения.Но когда я, например, использую data ["ProductId"] значение равно null / undefined.

Может кто-нибудь помочь, пожалуйста?

Спасибо

Здесьэто скриншот вывода моей консоли объекта данных: введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

NSwag настроен неправильно, используйте DefaultPropertyNameHandling: CamelCase для ASP.NET Core

Или используйте новый генератор swagger на основе api explorer ядра asp.net, который автоматически обнаруживает средство разрешения контракта.(Experimental)

0 голосов
/ 17 мая 2018

Теперь я могу выяснить, что я могу привести объект данных непосредственно к Product:

  init(data?: any) {
    var p = <Product>data;

Это работает, но я спрашиваю себя, почему сгенерированный класс имеет метод init с вручнуюустановка атрибутов, когда можно привести объект напрямую?

...