Angular7: Как правильно отобразить данные при подписке на Observable, если модель отличается от JSON - PullRequest
0 голосов
/ 19 февраля 2019

Я делаю запрос GET к API REST.Мой класс Model немного отличается от запрошенного JSON, и я, похоже, не могу получить никаких данных: когда я захожу в консоль, мой объект Model не определен.Как правильно сопоставить значения при подписке на наблюдаемые?

Моя модель:

export class Signalement {

idsignalement: number;
destinataire_id: number;
idstatut: number;
iddomaine: number;
idlocalisation: number;
idtype: number;
idemetteur: number;
x: number;
y: number;
nom: string;
description: string;
descriptionlieu: string;
la_date: string;
}

Мой JSON:

{
    "_embedded": {
        "signalements": [
            {
                "idsignalement": 1,
                "iddomaine": 1,
                "idlocalisation": 1,
                "idtype": 1,
                "idemetteur": 1,
                "idstatut": 1,
                "x": 1,
                "y": 1,
                "nom": "Postman Signalement",
                "description": "Envoie depuis postman",
                "descriptionlieu": "Sur la VM",
                "la_date": "2019-02-08T09:25:36.968+0000",
                "_links": {
                    "self": {
                        "href": "***/signalements/1"
                    },
                    "signalement": {
                        "href": "***/signalements/1"
                    },
                    "destinataire": {
                        "href": "**/signalements/1/destinataire"
                    }
                }
            }
        ]
    },
    "_links": {
        "self": {
            "href": "***:8080/signalements{?page,size,sort}",
            "templated": true
        },
        "profile": {
            "href": "http://***/profile/signalements"
        }
    },
    "page": {
        "size": 20,
        "totalElements": 1,
        "totalPages": 1,
        "number": 0
    }
}

Мой компонент:

export class SignalementsComponent implements OnInit {

signalements: Signalement[];

constructor(private signalementService: SignalementService, private messageService: MessageService) { }

ngOnInit() {
    this.getSignalements();
}

getSignalements(): void {
    this.signalementService.getSignalements().subscribe((data) => {
        this.signalements = data;
    });
}

Мой сервис:

export class SignalementService {

constructor(private http: HttpClient) { }

getSignalements(): Observable<Signalement[]> {
    return this.http.get<Signalement[]>(href); 
    }
}

1 Ответ

0 голосов
/ 19 февраля 2019

Вы не можете сделать return this.http.get<Signalement[]>(href);, потому что данные, которые вы получаете, не являются Signalement объектом.

Имейте в виду, что javascript не набирается, поэтому указатели типов, которые вы вводите в Typescript, являются просто помощниками для вашегокодирование, а не действующие правила.

Учитывая схему ваших ответов, вы должны сначала копать в поле _embedded.Поэтому вы должны сделать:

return this.http.get<Signalement[]>.pipe(map(data => data['_embedded']['signalments']));

Вы также должны добавить проверки, чтобы убедиться, что поля действительно присутствуют и в правильном формате, чтобы избежать проблем безопасности в зависимости от потенциального источника данных и т. Д.

...