Angular 6 http: Kommunikation med api

Opret en service

Opret en ny service:

Jeg vælger at kalder den ApiCom (Api Communication), men det er helt op til dig at vælge et navn. Derudover placerer jeg alle mine services under ~/mitProjekt/src/app/_service.

Dette er den nye service og jeg har derudover importeret Angular’s indbyggede http klient og føjet en ny instans til constructor funktionen:

Der findes en hjemmeside med eksempeldata, som kan benyttes i undervisningssituationer o.lign. Den hedder jsonplaceholder.typicode.com og den vil jeg bruge her også:

Nu tilføjer vi nemlig en ny funktion i vores service modul, der henter data på nogle brugere:

Voila! Det var det… nu kan vi så bruge den nye service i et komponent der skal præsentere disse data:

Bemærk at vi importerer vores egen service og derudover Observable fra rxjs. Sidstnævnte gennemgås ikke i detaljer her, men kort sagt er det et modul der vil indeholde de data vi henter via vores api service. Vi har også erklæret et users$ object og placeret hentningen af data i ngOnInit. Det betyder at så snart EtKomponent bliver aktiveret, hentes data.

I EtKomponent‘s html fil, kan man nu præsentere disse data:

Funktionen *ngFor itererer over alle elementer i users$ og dermed udskrives en hele listen.

Husk at føje din ApiCom service til app.module.ts:


… og i samme fil, skal den også føjes til providers:

dev, test, prod… api adressen er forskellig

Du har sikkert bemærket filerne ~/mitProject/environment.ts og environment.prod.ts. Her angiver du de værdier der differentierer mellem de forskellige miljøer (typisk udvikling, test og produktion). I mit projekt skal jeg distingvere mellem test og produktion.

Når du kører ng serve -o bruger Angular environment.ts:


…og ved ng serve -o --prod bruger Angular environment.prod.ts:


Nu kan du importere environment i din api service som dermed har adgang til den url der skal benyttes i et givent miljø:

Så langt så godt…. men vi kaster lige et blik på environment.ts igen. Her har vi i apiUrl blot angivet en relativ url i stedet for en absolut.  Her står nemlig blot /api. Det er der en forklaring på:

Hvis du udvikler på en server og har både front- og backend under samme domæne, kan du blot angive adressen på dit test-domæne i environment.ts. Men hvis du, ligesom jeg, udvikler din frontend på localhost og din backend ligger på en server, får du hurtigt en CORS udfordring… Det kommer ofte til udtryk ved denne fejl:

Failed to load ‘https://test.eksempel.com’: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://localhost:4200’ is therefore not allowed access.

Det løser vi i følgende afsnit:

Proxy indstillinger

For at undgå en CORS fejl når du udvikler lokalt og ønsker at benytte en ekstern ressource, kan du konfigurere en proxy. Du opretter ganske enkelt filen ~mitProjekt/proxy.conf.json:

… og føjer den til angular.json:


Fremover når du benytter ng serve vil Angular medtage dine proxy indstillinger og i kulissen dirigere alle forespørgsler til /api videre til https://test-api.eksempel.com … Din browser tror at forespørgslen går til localhost:4200/api og du undgår dermed CORS fejl 🙂