HttpClient не работает, в отличие от Http, для внутренних запросов с Angular

Хорошо, я объясню свою проблему. Я начинаю с Angular, и это первый раз, когда я использую REST API, поэтому что-то может ускользнуть от меня.

В моем случае я использую объект Period в Typescript и в C#, вот они:

Период ТС:

export class Period {
    id: number;
    year: string;
    month: string;
    blocked: boolean;

    constructor(id: number, year: string, month: string, blocked: boolean) {
        this.id = id;
        this.year = year;
        this.month = month;
        this.blocked = blocked;
    }
}

Период С#:

public class Period
  {
    [JsonProperty(PropertyName = "id")]
    public int ID { get; set; }
    [JsonProperty(PropertyName = "year")]
    public string Year { get; set; }
    [JsonProperty(PropertyName = "month")]
    public string Month { get; set; }
    [JsonProperty(PropertyName = "blocked")]
    public bool Blocked { get; set; }

    public Period() { }
  }

До этого мне удавалось восстановить данные из моей базы данных через Postman.

Почтальон: ПОЛУЧИТЬ -> https://localhost:5001/api/period/GetAllPeriods

[
  {
     "id": 122,
     "year": "2019",
     "month": "03",
     "blocked": false
  },
  {
     "id": 121,
     "year": "2019",
     "month": "02",
     "blocked": false
  }, ...
]

HttpClient не работает, в отличие от Http, для внутренних запросов с Angular

Я провел небольшое исследование и несколько тестов, и приведенный ниже код работает. Я получаю свои данные JSON, которые я преобразовываю в список объектов Period в Typescript. Затем я отображаю их на своей странице, и все работает правильно.

Но на Угловая документация написано, что Http устарела и лучше использовать HttpClient.

период.service.ts: http

export class PeriodService {

  constructor(private http: Http) { }

  //Http
  getPeriods(): Observable<Period[]> {
    return this.http.get('/api/period/GetAllPeriods')
      .pipe(
        catchError(this.handleError),
        map(response => {
          const periods = response.json();
          return periods.map((period) => new Period(period.id, period.year, period.month, period.blocked));
        })
      );
  }

  private handleError(error: HttpErrorResponse) {
    if (error.error instanceof ErrorEvent) {
      // A client-side or network error occurred. Handle it accordingly.
      console.error('An error occurred:', error.error.message);
    } else {
      // The backend returned an unsuccessful response code.
      // The response body may contain clues as to what went wrong,
      console.error(
        `Backend returned code ${error.status}, ` +
        `body was: ${error.error}`);
      console.error(error);
    }
    // return an observable with a user-facing error message
    return throwError(
      'Something bad happened; please try again later.');
  };
}

Поэтому я попытался использовать HttpClient. Тем не менее, я не могу восстановить данные в моем сервисе.

период.service.ts: HttpClient

export class PeriodService {

  constructor(private http: HttpClient) { }

  //HttpClient
  getPeriods(): Observable<Period[]> {
    return this.http.get<Period[]>('https://localhost:5001/api/period/GetAllPeriods')
      .pipe(
        catchError(this.handleError)
      );
  }

  private handleError(error: HttpErrorResponse) {
    if (error.error instanceof ErrorEvent) {
      // A client-side or network error occurred. Handle it accordingly.
      console.error('An error occurred:', error.error.message);
    } else {
      // The backend returned an unsuccessful response code.
      // The response body may contain clues as to what went wrong,
      console.error(
        `Backend returned code ${error.status}, ` +
        `body was: ${error.error}`);
      console.error(error);
    }
    // return an observable with a user-facing error message
    return throwError(
      'Something bad happened; please try again later.');
  };
}

HttpClient не работает, в отличие от Http, для внутренних запросов с Angular

Чтобы было понятнее, я получаю данные JSON из API, но когда я использую сервис HttpClient, в консоли браузера появляется сообщение об ошибке, потому что он не может найти данные, которые еще не доступны. Итак, я думаю, что моя проблема связана с обслуживанием с HttpClient.

Если у вас есть идеи, мне интересно. Заранее спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
368
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Моя проблема была: import {HttpClientInMemoryWebApiModule} from 'angular-in-memory-web-api';

Оказывается, для разработки своего приложения я начал использовать HttpClientInMemoryWebApiModule. Но этот модуль несовместим с HttpClient. Его необходимо удалить, чтобы использовать HttpClient.

Теперь мое приложение работает правильно и отображает данные.

В вашем компоненте, когда вы делаете вызов метода getPeriods(), добавьте в него подписку, так как он возвращает наблюдаемый тип.

this.getPeriods().subscribe(Response => { console.info(Response)});

Другие вопросы по теме

Похожие вопросы