J'essaie de récupérer des données via REST avec angular 2 HttpClient. Je suis le tutoriel angulaire ici. https://angular.io/tutorial/toh-pt6 et sous la Héros et HTTP vous verrez ce bout de code utilisé pour récupérer les données des héros via http.
getHeroes(): Promise<Hero[]> {
return this.http.get(this.heroesUrl)
.toPromise()
.then(response => response.json().data as Hero[])
.catch(this.handleError);
}
Et ci-dessous, une version similaire que j'ai écrite dans mon application
fetch(startIndex: number, limit: number): Promise<Order[]> {
let url = this.baseUrl + "&startIndex=" + startIndex + "&limit=" + limit;
return this.http.get(url)
.toPromise()
.then(response => response.json().results as Order[])
.catch(this.handleError);
}
J'utilise InteliJ Idea et il y a une ligne rouge sur l'appel response.json() et même quand j'essaie de construire en utilisant ng construire Je reçois l'erreur.
La propriété 'json' n'existe pas sur le type 'Object'.
Vous pouvez remarquer qu'au lieu de json().data
J'ai json().results
. C'est parce que, selon le tutoriel, le serveur a répondu avec un objet qui a une valeur de data
mais mon propre serveur répond avec un objet qui a un champ results
champ. Si vous faites défiler un peu le tutoriel, vous verrez ce point.
Notez la forme des données que le serveur renvoie. Cet exemple particulier Cet exemple d'API Web en mémoire renvoie un objet avec une propriété de données. Votre API peut renvoyer autre chose. Adaptez le code à votre API WEB.
Pour tenter de résoudre ce problème, j'ai essayé quelque chose comme ceci
(response: Response) => response.json().results as Order[]
Lorsque j'ai fait cela, la méthode .json() a été résolue mais une autre erreur s'est affichée, indiquant que
La propriété results n'existe pas sur le type Promise
J'ai essayé de corriger cela en définissant une interface
interface OrderResponse {
orders: Order[];
}
Et modifié l'appel au get pour
.get<OrderResponse>(url)...
Mais cela n'a pas fonctionné non plus. Une autre erreur est apparue
Le type 'OrderResponse' n'est pas assignable au type 'Response'.
Une chose à noter est que, dans le tutoriel, ils ont utilisé le Angular HttpModule mais dans mon application, j'utilise le nouveau Angular HttpClientModule donc peut-être que c'est là que l'erreur vient.
Je suis nouveau dans Angular 2 et c'est la première application que je construis avec. Si le code ci-dessus n'est plus valable avec le nouveau HttpClientModule, j'apprécierais toute aide sur la façon de réaliser la même chose avec le nouveau HttpClientModule.
J'ai trouvé des questions similaires La propriété 'json' n'existe pas sur le type '{}'. y La propriété n'existe pas sur le type 'object'. mais aucune des réponses ne m'a aidé.
Mise à jour
Comme le suggèrent les commentaires, il n'y a pas de méthode .json() dans le nouveau HttpClientModule. J'aimerais quand même avoir de l'aide sur la façon d'obtenir le même effet avec le nouveau module. Dans le guide, ils ont fait quelque chose comme ceci
http.get<ItemsResponse>('/api/items').subscribe(data => {
// data is now an instance of type ItemsResponse, so you can do this:
this.results = data.results;
});
Ce que je comprends parfaitement mais mon problème est que ce code ne se trouve pas dans un composant mais dans un service, donc appeler subscribe et assigner le résultat à un champ d'instance n'a pas beaucoup de sens.
J'ai besoin que mon service renvoie un tableau de commandes enveloppé dans une Promise. Mes composants peuvent simplement faire des appels comme
this.orderService.fetch(0, 10).then(orders => this.orders = orders)
J'ai également pensé à déclarer une variable locale dans ma méthode de récupération de service afin de pouvoir faire
.subscribe(data => {
this.orders = data.results;
}
// and out of the get call I return my local variable orders like
return Promise.resolve(orders)
Mais cela n'a pas beaucoup de sens pour moi car l'appel à .get() est asynchrone et la méthode peut revenir avant même que toutes les données soient récupérées et le tableau des commandes peut être vide.
Mise à jour
Comme demandé, voici le code pour handleError
private handleError(error: any): Promise<any> {
console.log('An error occured ', error);
return Promise.reject(error.message || error);
}
4 votes
Il n'existe pas de méthode .json() dans l'API HttpClient. Le tutoriel que vous suivez utilise l'ancienne API Http. Veuillez vérifier angular.io/guide/http
3 votes
Comme l'a dit @Jota.Toledo, il existe deux clients http - Http et HttpClient. HttpClient est le nouveau client, qui n'utilise plus la méthode .json().
0 votes
@matmo merci pour votre contribution. J'ai mis à jour ma question. Veuillez y jeter un coup d'œil. Merci
0 votes
Pourquoi avoir besoin de retourner une promesse ? les observables sont mieux si vous me le demandez
0 votes
Pouvez-vous répondre à la question avec une solution qui renvoie un observable alors ? J'ai juste besoin que le service renvoie un tableau de commandes, je ne me soucie pas vraiment de savoir si c'est enveloppé dans une Promise ou un observable. J'ai encore du mal à comprendre ces concepts. Ou ma question n'est-elle pas assez claire ?
0 votes
@ivange94 a ajouté une réponse