1
votes

appel api dans Angular 8, le résultat n'est pas défini

J'ai une application angular 8 et je souhaite appeler un appel Get api.

Mais j'obtiens cette erreur:


getDossierEntry( patientUUID: string, type: String = '' ): Observable<DossierEntry[]> {
  patientUUID = '0d584905-fc20-4723-870a-0f0214419507';
  const entryType = type === '' ? 'all' : 'type/' + type;

  console.log(this.http.get<DossierEntry[]>('/api/patient/' + patientUUID + '/DossierEntry/' + entryType ));

  console.log(patientUUID);
  return this.http.get<DossierEntry[]>('/api/patient/' + patientUUID + '/DossierEntry/' + entryType );
}

Voici le fichier ts: p>

HttpErrorResponse {headers: HttpHeaders, status: 404, statusText: "Not Found", url: "http://localhost:4200/api/patient/$%7BpatientUUID%7D/DossierEntry/all", ok: false, …}
error: "<!DOCTYPE html>↵<html lang="en">↵<head>↵<meta charset="utf-8">↵<title>Error</title>↵</head>↵<body>↵<pre>Cannot GET /api/patient/$%7BpatientUUID%7D/DossierEntry/all</pre>↵</body>↵</html>↵"
headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: Æ’}
message: "Http failure response for http://localhost:4200/api/patient/$%7BpatientUUID%7D/DossierEntry/all: 404 Not Found"
name: "HttpErrorResponse"
ok: false
status: 404
statusText: "Not Found"
url: "http://localhost:4200/api/patient/$%7BpatientUUID%7D/DossierEntry/all"
__proto__: HttpResponseBase

Et voici le service:

Observable {_isScalar: false, source: Observable, operator: MapOperator}
operator: MapOperator
project: Æ’ (res)
thisArg: undefined
__proto__: Object
source: Observable {_isScalar: false, source: Observable, operator: FilterOperator}
_isScalar: false
__proto__: Object

Et voici l'erreur totale

 ngOnInit() {
    this.documentCorrespondencService.getDossierEntry('physical').subscribe((result: any)=> {
       console.log(result.values);
       this.entries = result;
       this.dossiersLoaded = true;
   });
 }


5 commentaires

Vous appelez une URL qui renvoie une erreur 404. Votre traitement du patientUUID dans l'URL est probablement incorrect.


Vous semblez ne pas remplacer la valeur patientUUID lors de l'appel de l'API.


Mais pourquoi l'abonné obtiendrait cela indéfini, si c'est une erreur? throwError ("vous ne verrez pas ce message"). subscribe (console.log) n'imprime rien. Y a-t-il un intercepteur quelque part au milieu, mangeant des réponses d'erreur HTTP et émettant des valeurs vides?


Mettre à jour le post ok, ce sera bien


voir la mise à jour de l'article


4 Réponses :


0
votes

Comme je vois, la réponse que vous obtenez est 404, ce qui signifie que l'URL n'est pas trouvée.

Dans votre code,

vous ne remplacez pas la valeur de patientUUID que vous pouvez vérifier dans l'URL

return this.http.get<DossierEntry[]>('/api/patient/{patientUUID}/DossierEntry/' + entryType


4 commentaires

Mais qu'est-ce que je dois changer alors?


Pouvez-vous dire ce que je fais de mal? OU que je dois publier plus de code? Serait bien


Salut j'ai ajouté l'Interceptor. Mais qu'est-ce que je dois changer alors? Merci


Mais alors comment émettre le patientUUID alors dans l'URL? Merci



0
votes

en mode développeur, vous devez ajouter proxy.conf.json pour transférer vers votre serveur: par exemple:

{
  "/api": {
    "target": "http://localhost:1337",
    "secure": false
  }
}


3 commentaires

Je ne comprends pas ça. qu'est-ce que 1337 ?? J'ai mis à jour le message


ce n'est qu'un exemple. mon serveur écoute sur le port 1337. Si vous appelez l'url relative (/ api), vous devez la rediriger vers votre serveur, si vous appelez externe avec ip, vous devez définir l'URL absolue, car le relatif rappelle le serveur qui s'exécute angular.


Oke, mais ce n'est pas le problème. J'ai mis à jour le message



0
votes

Mappez le type de résultat sur n'importe quel ou

  ngOnInit() {
    this.healthAPIService.getDossierEntry('physical').subscribe((result:any)=> {
       console.log(result.values);
       this.entries = result;
       this.dossiersLoaded = true;
   });
 }

ngOnInit() {
    this.healthAPIService.getDossierEntry('physical').subscribe((result:DossierEntry[])=> {
      console.log(result.values);
      this.entries = result;
      this.dossiersLoaded = true;
    });
  }


9 commentaires

Merci de votre aide. Mais obtenez toujours une erreur. Mise à jour du message


pourriez-vous s'il vous plaît mettre le résultat entre parenthèses comme ** (result:any)=> ** et vérifier une fois.


Mais cela n'a-t-il rien à voir avec la méthode invoke? Parce que je ne déclenche pas cette méthode bien sûr, lorsque j'utilise le httpClient


atSantosh Avez-vous d'autres suggestions?


J'ai ajouté l'INterceptor


Veuillez vérifier votre URL backend. Vous en faites un faux http: // localhost: 4200 / api / patient /% 7BpatientUUID% 7D / DossierE‌ ntry / type / physical . Il doit être http: // localhost: 1337 / api / patient / / DossierEntry‌ / type / physical . et doit être remplacé par l'ID réel, comme si patientUUID est 11001, alors l'URL doit être http: // localhost: 1337 / api / patient / 11001 / DossierEntry / type / ph‌ ysical


Oui, comprenez. Mais c'est le problème. Alors pourquoi ne trouve-t-il pas l'identifiant de l'utilisateur? l'url correcte de Swagger est la suivante: / api / patient / {participantId} / DossierEntry / type / {dossierEntry‌ CategoryType}


Qu'est-ce que je dois changer à propos de l'appel API alors? getDossierEntry (type: String = ''): Observable {console.log ('bonjour'); const entryType = type === ''? 'tous': 'type /' + type; return this.http.get ('/ api / patient / {patientUUID} / Do‌ ssierEntry /' + entryType)}


Donc, même quand je fais patientUUID codé en dur, comme ceci: return this.http.get ('/ api / patient / {0d584905-fc20-4‌ 723-870a-0f021441950‌ 7} / DossierEntry /' + entryType );



1
votes

Pour obtenir le résultat attendu, utilisez l'option ci-dessous de mise à jour de l'URL de l'API avec patientUUID

Option 1:

console.log(this.http.get<DossierEntry[]>('/api/patient/' + patientUUID + '/DossierEntry/' + entryType)
Option 2:

Autre façon d'utiliser patientUUID dans l'URL

getDossierEntry( patientUUID: string, type: String = '' ): Observable<DossierEntry[]> {
        const entryType = type === '' ? 'all' : 'type/' + type;
        return this.http.get<DossierEntry[]>('/api/patient/${patientUUID}/DossierEntry/' + entryType);
  }

Problème : La valeur patientUUID n'est pas ajoutée à l'URL à l'emplacement prévu et la valeur 404 est introuvable car elle s'avère invalide

Pour résoudre ce problème, mettez à jour l'URL de l'API comme ci-dessus avec les paramètres - patientUUID et type et pour déboguer ajouter une console avant de revenir pour vérifier l'url comme ci-dessous

 getDossierEntry( patientUUID: string, type: String = '' ): Observable<DossierEntry[]> {
    const entryType = type === '' ? 'all' : 'type/' + type;
    return this.http.get<DossierEntry[]>('/api/patient/' + patientUUID + '/DossierEntry/' + entryType );
  }


18 commentaires

Merci . Je vais le vérifier demain et je vous laisse maintenant.


Mais puis-je vous envoyer les fichiers?


@mightycodeNewton, je ne pense pas que SO autorise l'envoi de fichiers, mais vous pouvez créer stackblitz pour reproduire votre problème


Mais nous pouvons aller discuter. Mais pouvez-vous m'inviter à discuter? Parce que je ne vois pas la fonction ici.


Naga, tu es là? Je le teste maintenant


Mais pouvons-nous aller discuter.


J'utilise un mobile et non mon ordinateur pour le moment, veuillez tester et me faire savoir si vous rencontrez un problème / une erreur


Mise à jour du message


Mais cela n'a rien à voir avec l'intercepteur. dans mon post


Pouvez-vous essayer la première option une fois?


Oui, j'ai aussi essayé celui-là. Mais cela ne prend pas le patientUUID. Parce que même lorsque je fais un patientUUID codé en dur, cela ne fonctionne pas non plus.


et si je fais ceci: console.log (patientUUID); ça revient physique.


utilisez '/ api / patient /' + patientUUID + '/ DossierEntry /' + entryType, from post, je vois que vous utilisez $ {patientUUID}


Je suis dans le fuseau horaire CST


J'utilise ça: return this.http.get ('/ api / patient /' + patientUUID + '/ DossierEntry /' + entryType);


Continuons cette discussion dans le chat .


Je suis dans le chat maintenant. Mais je pense que cela a à voir avec la méthode invoke. Mais je ne sais pas comment changer cela.


Oke, problème résolu. Je vous remercie pour vos efforts! oke, gentil