Хорошо, я объясню свою проблему. Я начинаю с 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
}, ...
]
Я провел небольшое исследование и несколько тестов, и приведенный ниже код работает.
Я получаю свои данные 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.');
};
}
Чтобы было понятнее, я получаю данные JSON из API, но когда я использую сервис HttpClient, в консоли браузера появляется сообщение об ошибке, потому что он не может найти данные, которые еще не доступны.
Итак, я думаю, что моя проблема связана с обслуживанием с HttpClient.
Если у вас есть идеи, мне интересно. Заранее спасибо.





Что ж, прошло несколько дней, как я застрял в этой проблеме, и как только мой вопрос был задан, я просто нашел решение ...
Моя проблема была: import {HttpClientInMemoryWebApiModule} from 'angular-in-memory-web-api';
Оказывается, для разработки своего приложения я начал использовать HttpClientInMemoryWebApiModule.
Но этот модуль несовместим с HttpClient.
Его необходимо удалить, чтобы использовать HttpClient.
Теперь мое приложение работает правильно и отображает данные.
В вашем компоненте, когда вы делаете вызов метода getPeriods(), добавьте в него подписку, так как он возвращает наблюдаемый тип.
this.getPeriods().subscribe(Response => { console.info(Response)});