Bevezetés a tavaszi HATEOAS-ba

REST felső

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Áttekintés

Ez a cikk elmagyarázza a hipermédia által vezérelt REST webszolgáltatás létrehozásának folyamatát a Spring HATEOAS projekt segítségével.

2. Tavasz-HATEOAS

A tavaszi HATEOAS projekt az API-k könyvtárát jelenti, amelyek segítségével könnyen létrehozhatunk olyan REST reprezentációkat, amelyek követik a HATEOAS (Hypertext as the Engine of Application State) elvét.

Általánosságban elmondható, hogy az alapelv azt jelenti, hogy az API-nak végig kell vezetnie az ügyfelet az alkalmazáson keresztül azáltal, hogy az egyes válaszokkal együtt releváns információkat ad vissza a következő lehetséges lépésekről.

Ebben a cikkben egy példát fogunk építeni a Spring HATEOAS segítségével azzal a céllal, hogy leválasszuk az ügyfelet és a kiszolgálót, és elméletileg lehetővé tesszük az API számára, hogy az ügyfelek feltörése nélkül megváltoztassa az URI sémáját.

3. Előkészítés

Először tegyük hozzá a tavaszi HATEOAS-függőséget:

 org.springframework.boot spring-boot-starter-hateoas 2.1.4.KÖZLEMÉNY 

Ha nem a Spring Boot programot használjuk, akkor a következő könyvtárakat vehetjük fel projektünkbe:

 org.springframework.hateoas spring-hateoas 0.25.1.RELEASE org.springframework.plugin spring-plugin-core 1.2.0.RELEASE 

Mint mindig, a Maven Central-ban is megkereshetjük a HATEOAS indító, a rugós-hateoák és a rugós-plugin-core függőségek legújabb verzióit.

Ezután megvan a Vevő forrás tavaszi HATEOAS támogatás nélkül:

public class Ügyfél {private String customerId; privát String ügyfélNév; privát String companyName; // szabványos mérőeszközök és beállítók} 

És van egy kontroller osztályunk a Spring HATEOAS támogatás nélkül:

@RestController @RequestMapping (value = "/ customers") public class CustomerController {@Autowired private CustomerService customerService; @GetMapping ("/ {customerId}") nyilvános ügyfél getCustomerById (@PathVariable String customerId) {return customerService.getCustomerDetail (customerId); }} 

Végül a Vevő erőforrás reprezentáció:

{"customerId": "10A", "customerName": "Jane", "customerCompany": "ABC Company"} 

4. A HATEOAS támogatás hozzáadása

Egy tavaszi HATEOAS projektben nincs szükségünk sem a Servlet-kontextus megkeresésére, sem az útváltozó összefűzésére az alap URI-ba.

Helyette, A HATEOAS tavasz három absztrakciót kínál az URI létrehozásához - RepresentationModel, Link és WebMvcLinkBuilder. Ezekkel felhasználhatjuk a metaadatok létrehozását és az erőforrás-reprezentációhoz való társítását.

4.1. A Hypermedia támogatás hozzáadása egy erőforráshoz

A projekt biztosítja az úgynevezett alaposztályt RepresentationModel örökölni az erőforrás-reprezentáció létrehozásakor:

public class Az ügyfél kiterjeszti a RepresentationModel {private String customerId; privát String ügyfélNév; privát String companyName; // szabványos mérőeszközök és beállítók} 

A Vevő erőforrás a RepresentationModel osztály örökli a add () módszer. Tehát miután létrehoztunk egy linket, könnyen beállíthatjuk ezt az értéket az erőforrás-ábrázoláshoz anélkül, hogy új mezőket adnánk hozzá.

4.2. Linkek létrehozása

A tavaszi HATEOAS a Link objektum a metaadatok tárolására (az erőforrás helye vagy URI-ja).

Először létrehozunk egy egyszerű linket manuálisan:

Link link = new Link ("// localhost: 8080 / spring-security-rest / api / customers / 10A"); 

A Link objektum követi a Atom link szintaxist, és a rel amely azonosítja az erőforrással való kapcsolatot és href attribútum, amely maga a tényleges link.

Itt van, hogyan Vevő Az erőforrás most úgy néz ki, hogy tartalmazza az új linket:

{"customerId": "10A", "customerName": "Jane", "customerCompany": "ABC Company", "_links": {"self": {"href": "// localhost: 8080 / spring-security -rest / api / customers / 10A "}}} 

A válaszhoz társított URI minősítés a maga link. A szemantika a maga A kapcsolat egyértelmű - ez egyszerűen az a kanonikus hely, ahol az erőforrás elérhető.

4.3. Jobb linkek létrehozása

A könyvtár egy másik nagyon fontos absztrakciója az a WebMvcLinkBuilder - ami leegyszerűsíti az URI-k összeállítását elkerülve a keményen kódolt linkeket.

A következő részlet részletesen bemutatja az ügyfél önlinkjének felépítését a WebMvcLinkBuilder osztály:

linkTo (CustomerController.class) .slash (customer.getCustomerId ()). withSelfRel (); 

Nézzük meg:

  • a link ehhez() metódus megvizsgálja a vezérlő osztályt és megszerzi annak gyökér leképezését
  • a vágás() módszer hozzáadja a Ügyfél-azonosító érték a link útváltozójaként
  • végül a withSelfMethod () a kapcsolatot önkapcsolatnak minősíti

5. Kapcsolatok

Az előző részben megmutattunk egy önreferencia relációt. Az összetettebb rendszerek azonban más kapcsolatokat is magukban foglalhatnak.

Például a vevő kapcsolata lehet a megrendelésekkel. Modellezzük a Rendelés osztály, mint erőforrás:

public class Order kiterjeszti a RepresentationModel {private String orderId; magán dupla ár; privát int mennyiség; // szabványos mérőeszközök és beállítók} 

Ezen a ponton kiterjeszthetjük a CustomerController olyan módszerrel, amely egy adott ügyfél összes megrendelését visszaadja:

@GetMapping (value = "/ {customerId} / megrendelések", = = "application / hal + json"}) nyilvános CollectionModel getOrdersForCustomer (@PathVariable final String customerId) {List megrendelések = orderService.getAllOrdersForCustomer (customerId); for (végső megrendelés: megrendelések) {Link selfLink = linkTo (methodOn (CustomerController.class) .getOrderById (customerId, order.getOrderId ())). withSelfRel (); rendelés.add (selfLink); } Link link = linkTo (methodOn (CustomerController.class) .getOrdersForCustomer (customerId)). WithSelfRel (); CollectionModel eredmény = new CollectionModel (megrendelések, link); visszatérési eredmény; } 

Módszerünk a CollectionModel objektumot, hogy megfeleljen a HAL visszatérési típusnak, valamint_maga" link az egyes megrendelésekhez és a teljes lista.

Fontos észrevenni itt, hogy az ügyfélrendelések hiperhivatala a feltérképezésétől függ getOrdersForCustomer () módszer. Az ilyen típusú hivatkozásokra metódus linkként hivatkozunk, és megmutatjuk, hogyan WebMvcLinkBuilder segíthet létrehozásában.

6. Linkek a vezérlő módszereihez

A WebMvcLinkBuilder gazdag támogatást kínál a tavaszi MVC vezérlők számára. Az alábbi példa bemutatja, hogyan lehet a HATEOAS hiperhivatkozásokat a getOrdersForCustomer () módszere CustomerController osztály:

Link megrendelésekLink = linkTo (methodOn (CustomerController.class) .getOrdersForCustomer (customerId)). WithRel ("allOrders"); 

A methodOn () megkapja a módszer leképezését a cél metódus dummy meghívásával a proxy vezérlőn, és beállítja a Ügyfél-azonosító mint az URI útváltozója.

7. Tavaszi HATEOAS akcióban

Tegyük össze az önlinket és a metódus link létrehozását a getAllCustomers () módszer:

@GetMapping (produkció = {"application / hal + json"}) nyilvános CollectionModel getAllCustomers () {List allCustomers = customerService.allCustomers (); for (Ügyfél ügyfél: allCustomers) {String customerId = customer.getCustomerId (); Link selfLink = linkTo (CustomerController.class) .slash (customerId) .withSelfRel (); customer.add (selfLink); if (orderService.getAllOrdersForCustomer (customerId) .size ()> 0) {Link megrendelésekLink = linkTo (methodOn (CustomerController.class) .getOrdersForCustomer (customerId)) withRel ("allOrders"); ügyfél.add (megrendelésekLink); }} Link link = linkTo (CustomerController.class) .withSelfRel (); CollectionModel eredmény = new CollectionModel (allCustomers, link); visszatérési eredmény; }

Ezután hívjuk meg a getAllCustomers () módszer:

curl // localhost: 8080 / spring-security-rest / api / customers 

És vizsgálja meg az eredményt:

{"_embedded": {"customerList": [{"customerId": "10A", "customerName": "Jane", "companyName": "ABC Company", "_links": {"self": {"href" : "// localhost: 8080 / spring-security-rest / api / customers / 10A"}, "allOrders": {"href": "// localhost: 8080 / spring-security-rest / api / customers / 10A / megrendelések: "}}}, {" customerId ":" 20B "," customerName ":" Bob "," companyName ":" XYZ Company "," _links ": {" self ": {" href ":" // localhost : 8080 / spring-security-rest / api / customers / 20B "}," allOrders ": {" href ":" // localhost: 8080 / spring-security-rest / api / customers / 20B / megrendelések "}}} , {"customerId": "30C", "customerName": "Tim", "companyName": "CKV Company", "_linkek": {"self": {"href": "// localhost: 8080 / spring- security-rest / api / customers / 30C "}}}]]}," _linkek ": {" self ": {" href ":" // localhost: 8080 / spring-security-rest / api / customers "}}}

Az egyes erőforrás-ábrázolásokon belül van egy maga link és a allRendelések link az ügyfél összes megrendelésének kibontásához. Ha az ügyfélnek nincs megrendelése, akkor a megrendelések linkje nem jelenik meg.

Ez a példa bemutatja, hogy a Spring HATEOAS hogyan segíti elő az API felfedezhetőségét egy pihenő webes szolgáltatásban. Ha a link létezik, az ügyfél követheti azt, és megszerezheti az összes megrendelést az ügyfél számára:

curl // localhost: 8080 / spring-security-rest / api / customers / 10A / megrendelések 
{"_embedded": {"orderList": [{"orderId": "001A", "price": 150, "mennyiség": 25, "_linkek": {"self": {"href": "// localhost : 8080 / spring-security-rest / api / customers / 10A / 001A "}}}, {" orderId ":" 002A "," price ": 250," mennyiség ": 15," _linkek ": {" self " : {"href": "// localhost: 8080 / spring-security-rest / api / customers / 10A / 002A"}}}]]}, "_links": {"self": {"href": "// localhost: 8080 / spring-security-rest / api / customers / 10A / megrendelések "}}}

8. Következtetés

Ebben az oktatóanyagban megvitattuk, hogyan kell készítsen egy hipermédia által vezérelt Spring REST webszolgáltatást a Spring HATEOAS projekt segítségével.

A példában azt látjuk, hogy az ügyfélnek egyetlen belépési pontja lehet az alkalmazáshoz, és a válaszábrázolás metaadatai alapján további műveletek hajthatók végre.

Ez lehetővé teszi a kiszolgáló számára az URI-séma megváltoztatását az ügyfél megszakítása nélkül. Az alkalmazás új lehetőségeket is hirdethet azáltal, hogy új hivatkozásokat vagy URI-kat tesz a reprezentációba.

Végül a cikk teljes megvalósítása megtalálható a GitHub projektben.

REST alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT