Enkel AngularJS front-end til en REST API

1. Oversigt

I denne hurtige vejledning lærer vi, hvordan man bruger en RESTful API fra en simpel AngularJS front-end.

Vi skal vise data i en tabel, oprette en ressource, opdatere dem og endelig slette dem.

2. REST API

Lad os først kigge hurtigt på vores enkle API - udsætte en Foder ressource med paginering:

  • Bliv pagineret - / api / myFeeds? page = {page} & size = {size} & sortDir = {dir} & sort = {propertyName}
  • skab - STOLPE / api / myFeeds
  • opdatering - SÆTTE / api / myFeeds / {id}
  • slet - SLET / api / myFeeds / {id}

En hurtig bemærkning her er, at paginering bruger følgende 4 parametre:

  • side: indeks for anmodet side
  • størrelse: maksimalt antal poster pr. side
  • sortere: navnet på ejendommen, der bruges til sortering
  • sortDir: sorteringsretningen

Og her er et eksempel på, hvad Foder ressource ligner:

{"id": 1, "name": "baeldung feed", "url": "/ feed"}

3. Feeds-siden

Lad os nu se på vores feeds-side:

      Tilføj nyt RSS-feed 
{{række.navn}}{{row.url}} Rediger Slet

Bemærk, at vi brugte ng-table til at vise data - mere om det i de følgende afsnit.

4. En vinkelkontroller

Lad os derefter se på vores AngularJS-controller:

var app = angular.module ('myApp', ["ngTable", "ngResource"]); app.controller ('mainCtrl', funktion ($ scope, NgTableParams, $ resource) {...});

Noter det:

  • Vi injicerede ngTabel modul til at bruge det til at vise vores data i en brugervenlig tabel og håndtere paginering / sortering
  • Vi injicerede også ngRessource modul til at bruge det til at få adgang til vores REST API-ressourcer

5. En AngularJS-datatabel

Lad os nu se hurtigt på ng-tabel modul - her er konfigurationen:

$ scope.feed = $ ressource ("api / myFeeds /: feedId", {feedId: '@ id'}); $ scope.tableParams = nye NgTableParams ({}, {getData: funktion (params) {var queryParams = {side: params.page () - 1, størrelse: params.count ()}; var sortingProp = Object.keys (params) .sorting ()); hvis (sortingProp.length == 1) {queryParams ["sort"] = sortingProp [0]; queryParams ["sortDir"] = params.sorting () [sortingProp [0]];} returner $ scope.feed.query (queryParams, function (data, headers) {var totalRecords = headers ("PAGING_INFO"). split (",") [0] .split ("=") [1]; params.total (totalRecords ); returner data;}). $ løfte;}});

API'en forventer en bestemt pagineringstilstand, så vi er nødt til at tilpasse det her i tabellen for at matche det. Vi bruger params ud af ng-modul og skab vores egne queryParams her.

Et par yderligere bemærkninger om pagination:

  • params.page () starter fra 1, så vi skal også sørge for, at det bliver nulindekseret, når vi kommunikerer med API'en
  • params.sorting () returnerer et objekt - for eksempel {“Navn”: “asc”}, så vi er nødt til at adskille nøglen og værdien som to forskellige parametre - sortere, sortDir
  • vi udtrækker det samlede antal af elementer fra en HTTP-overskrift i svaret

6. Flere operationer

Endelig kan vi udføre mange operationer ved hjælp af ngRessource modul - $ ressource dækker den fulde HTTP-semantik med hensyn til tilgængelige operationer. Vi kan også definere vores brugerdefinerede funktionalitet.

Vi har brugt forespørgsel i det foregående afsnit for at hente feedslisten. Bemærk, at begge dele og forespørgsel gør - men forespørgsel bruges til at håndtere en matrixrespons.

6.1. Tilføj et nyt Foder

For at tilføje nyt feed bruger vi $ ressource metode Gemme - som følger:

$ scope.feed = {navn: "Nyt feed", url: "//www.example.com/feed"}; $ scope.createFeed = funktion () {$ scope.feeds.save ($ scope.feed, funktion () {$ scope.tableParams.reload ();}); }

6.2. Opdater a Foder

Vi kan bruge vores egen brugerdefinerede metode med $ ressource - som følger:

$ scope.feeds = $ resource ("api / myFeeds /: feedId", {feedId: '@ id'}, {'update': {method: 'PUT'}}); $ scope.updateFeed = funktion () {$ scope.feeds.update ($ scope.feed, funktion () {$ scope.tableParams.reload ();}); } 

Bemærk hvordan vi konfigurerede vores egne opdatering metode til at sende en SÆTTE anmodning.

6.3. Slet a Foder

Endelig kan vi slette et feed ved hjælp af slet metode:

$ scope.confirmDelete = funktion (id) {$ scope.feeds.delete ({feedId: id}, funktion () {$ scope.tableParams.reload ();}); }

7. AngularJs-dialog

Lad os nu se, hvordan du bruger ngDialog modul til visning af enkel form til tilføjelse / opdatering af vores feeds.

Her er vores skabelon, vi kan definere den på en separat HTML-side eller på samme side:

{{feed.name}}

Gemme

Og så åbner vi vores dialog for at tilføje / redigere et feed:

$ scope.addNewFeed = funktion () {$ scope.feed = {navn: "Nyt feed", url: ""}; ngDialog.open ({skabelon: 'templateId', scope: $ scope}); } $ scope.editFeed = funktion (række) {$ scope.feed.id = row.id; $ scope.feed.name = række.navn; $ scope.feed.url = række.url; ngDialog.open ({template: 'templateId', scope: $ scope}); } $ scope.save = funktion () {ngDialog.close ('ngdialog1'); hvis (! $ scope.feed.id) {$ scope.createFeed (); } andet {$ scope.updateFeed (); }}

Noter det:

  • $ scope.save () kaldes, når brugeren klikker Gemme knappen i vores dialog
  • $ scope.addNewFeed () kaldes, når brugeren klikker Tilføj nyt feed knap på feeds-siden - den initialiserer en ny Foder objekt (uden id)
  • $ scope.editFeed () kaldes, når brugeren ønsker at redigere en bestemt række i Feeds-tabellen

8. Fejlhåndtering

Lad os endelig se hvordan man håndterer svarfejlmeddelelser ved hjælp af AngularJS.

For at håndtere serverfejlresponser globalt - i stedet for pr. Anmodning - registrerer vi en interceptor til $ httpTilbyder:

app.config (['$ httpProvider', funktion ($ httpProvider) {$ httpProvider.interceptors.push (funktion ($ q, $ rootScope) {return {'responseError': funktion (responsError) {$ rootScope.message = responsError. data.message; returnere $ q.reject (responseError);}};});}]);

Og her er vores meddelelsesrepræsentation i HTML:

 {{besked}} 

9. Konklusion

Dette var en hurtig opskrivning af forbrug af en REST API fra AngularJS.

Det fuld implementering af denne vejledning kan findes i github-projektet - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.


$config[zx-auto] not found$config[zx-overlay] not found