Advertisement
Gxbriel_99

http request problem on angular

Mar 23rd, 2025
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
TypeScript 4.76 KB | Source Code | 0 0
  1. //TYPE
  2. export type TFilm={
  3.     idFilm:number,
  4.     nome:string,
  5.     descrizione:string
  6. }
  7. //SERVICE
  8. import { Injectable } from '@angular/core';
  9. import { Categoria } from '../_type/categoria.type';
  10. import { Libro } from '../_type/libro.type';
  11. import { ChiamataHTTP } from '../_type/chiamataHTTP.type';
  12. import { HttpClient } from '@angular/common/http';
  13. import { Observable } from 'rxjs';
  14. import { IRispostaServer } from '../_interface/IRispostaServer.interface';
  15.  
  16. @Injectable({
  17.   providedIn: 'root'
  18. })
  19. export class ApiService {
  20.  
  21.   constructor(private http:HttpClient) { }
  22.  
  23. /**
  24.  *
  25.  * @param risorsa(string|number)[]
  26.  * questo array definisce la risorsa della collection oppure l'elemento specifico
  27.  * della risorsa
  28.  * La funzione calcola l'url dell'api dove X e' il nome dell'api(in questo esempio CATEGORIE)
  29.  * @returns string stringa che rappresenta l'endpoint del server
  30.  */
  31.   protected calcolaRisorsa(risorsa: (string | number)[]):string{
  32.     const server: string ='http://localhost:8000/api' //path della route
  33.     const versione:string='v1' //versione della route
  34.     let url= server+'/'+ versione+ '/'
  35.     risorsa.forEach(x=>{url=url+x+'/'})
  36.     return url
  37.   }
  38.  
  39.   /**
  40.    * Questa funzione definisce il tipo di risposta a seconda del tipo di richiesta fatta
  41.    * @param risorsa (string|number)[] risorsa di cui voglio sapere i dati(nome dell'api)
  42.    * @param tipo string GET|POST|PUT|DELETE tipo di chiamata HTTP
  43.    * @param parametri OBJECT|NULL paramentri da passare all'endpoint se e' di tipo (POST|PUT)
  44.    * @returns Observable
  45.    */
  46.   protected richiestaGenerica(risorsa: (number | string)[], tipo: ChiamataHTTP, parametri?: Object | null):Observable<IRispostaServer>{
  47.     //uso una funzione per calcolare l'url
  48.     const url=this.calcolaRisorsa(risorsa)
  49.  
  50.     //Qui vado a definire la risposta a seconda del tipo di richiesta
  51.     switch (tipo) {
  52.       case 'GET': return this.http.get<IRispostaServer>(url)
  53.         break;
  54.       // case 'POST':
  55.       //   break;
  56.       // case 'PUT':
  57.       //   break;
  58.       // case 'DELETE':
  59.       //   break
  60.       default: return this.http.get<IRispostaServer>(url)
  61.          break
  62.     }
  63.   }
  64.  
  65.  
  66.   //ESERCIZIO FATTO DA ME
  67.   public getFilms():Observable<IRispostaServer> {
  68.     const risorsa: string[] = ['film2']
  69.     return this.richiestaGenerica(risorsa, 'GET')
  70.   }
  71.   public getSingoloFilm(id:string):Observable<IRispostaServer> {
  72.     const risorsa: string[] = ['filmSIngolo',id]
  73.     return this.richiestaGenerica(risorsa, 'GET')
  74.   }
  75.  
  76. }
  77.  
  78. //TS DEL COMPONENT
  79. import { Component, OnInit } from '@angular/core';
  80. import { ActivatedRoute } from '@angular/router';
  81. import { delay, map, Observable } from 'rxjs';
  82. import { IRispostaServer } from 'src/app/_interface/IRispostaServer.interface';
  83. import { ApiService } from 'src/app/_service/api.service';
  84. import { TFilm } from 'src/app/_type/film.type';
  85.  
  86. @Component({
  87.   selector: 'app-selected',
  88.   templateUrl: './selected.component.html',
  89.   styleUrls: ['./selected.component.scss']
  90. })
  91. export class SelectedComponent implements OnInit {
  92.   //8) Dico alla pagina di cercare il valore nell'url definendolo nel constructor
  93.   //ActivatedRoute cerca i valori nell'url
  94.   //ApiService mi serve per fare le chiamate api
  95.  
  96.   //9)definisco una var che conterra' l'id che estraggo dall'url
  97.   id: string | null = null
  98.  
  99.   //12)Definisco l'OBS che mi ritornera' la risposta
  100.   singoloFilm$!: Observable<IRispostaServer>
  101.  
  102.   //14)Ora vado definire l'array che conterra la risposta
  103.   arrSingoloFilm: TFilm|null = null;
  104.  
  105.  
  106.   constructor(private api: ApiService, private route: ActivatedRoute) {
  107.     //10)indico che il valore di dovra' essere quello ottenuto dall'url e faccio il debug
  108.     this.id = this.route.snapshot.paramMap.get('id')
  109.     console.log(this.id)
  110.     //13)Controllo che l'id non sia null e se rispetta la condizione popolo l'obs
  111.     if (this.id !== null) {
  112.       this.singoloFilm$ = this.api.getSingoloFilm(this.id)
  113.     }
  114.   }
  115.   //11)Ora in ApiService creo la funzione che fara' la chiamata all'api
  116.  
  117.   //15)Ora vado definire la risposta
  118.   ngOnInit(): void {
  119.     console.log('ngOnInit chiamato');
  120.     this.singoloFilm$.pipe(
  121.       map(x => x.data),  
  122.     ).subscribe({
  123.       next: x => {
  124.         console.log('Dati ricevuti:', x);
  125.         this.arrSingoloFilm! = x;  
  126.       }
  127.     });
  128.    
  129.   }
  130.  
  131. }
  132.  
  133. //HTML DEL COMPOPNENT
  134. <ul *ngIf="arrSingoloFilm !== null">
  135.     <li>
  136.         <p>ID: {{ arrSingoloFilm.idFilm }}</p>
  137.         <p>NOME: {{ arrSingoloFilm.nome }}</p>
  138.         <p>DESCRIZIONE: {{ arrSingoloFilm.descrizione }}</p>
  139.     </li>
  140. </ul>
  141. <div *ngIf="arrSingoloFilm === null">
  142.     <p>Caricamento in corso...</p>
  143. </div>
  144.  
  145. //ERRORE
  146. In console vedo i dati ma non a video,se arrSingoloFilm diventa un array non trova le sue proprieta(ho controllato che sono quelle)
  147.  
Tags: angular
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement