ABONAMENTE VIDEO REDACȚIA
RO
EN
NOU
Numărul 146
Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 31
Abonament PDF

JavaFX și comunicarea prin RESTful Web Services

Silviu Dumitrescu
Line manager@Telenav



Diana Bălan
Map analyst@Telenav



PROGRAMARE

O aplicație client poate accesa resurse distribuite aflate la distanță. Există mai multe modalități de accesare a acestor resurse, dar poate cea mai portabilă este cea a serviciilor web. În acest articol vom aduce în discuție serviciile REST (Representational State Transfer), servicii autodescriptive, moderne, cu un API Java ce are evoluție spectaculoasă în ultimele versiuni ale platformei Java Enterprise.

Vom începe prin discutarea unor aspecte arhitecturale, care țin de înțelegerea componentelor ce fac parte dintr-o aplicație distribuită, ce folosește serviciile web.

Arhitectura pe două nivele (two tiers)

Această arhitectură are două componente esențiale:

A. Aplicația client cu următoarele caracteristici:

B. Serverul de baze de date.

O aplicație client JavaFX constă din următoarele:

Avantajele folosirii acestei arhitecturi sunt:

Dezavantajele sunt:

Arhitectura pe trei nivele (three tiers)

Are următoarea structură:

Aplicația pe partea de server de aplicație se descrie astfel:

Așadar, serverul de aplicație va conține o colecție de servicii web RESTful, care la rândul lor vor comunica prin JPA cu serverul de baze de date. Serverul de aplicație Glassfish furnizează infrastructura pentru ambele API-uri JPA și JAX-RS.

Avantajele folosirii unei arhitecturi three tiers:

Dezavantajele sunt:

În pofida dezavantajelor anterior enumerate, arhitectura pe trei nivele este utilizată frecvent pentru aplicații mari. Este cea pe care o vom aduce în discuție în acest articol și în următoarele articole pe această temă.

În partea următoare vom face o scurtă trecere în revistă a paradigmei serviciu web, ca modalitate prin care clarificăm ideile și pentru cei mai puțin familiarizați cu această paradigmă.

Servicii Web

Sunt aplicații ce comunică prin HTTP în WWW. Ele furnizează un standard ce facilitează interoperabilitatea aplicațiilor software ce rulează pe o varietate de platforme și framework-uri. Interoperabilitatea și extensibilitatea sunt date de XML. Ele pot fi combinate într-un mod care pierde cuplarea pentru a obține operații complexe.

Prin utilizarea serviciilor web o aplicație pe două nivele poate fi modificată la una pe trei nivele, ce poate opera peste web. Aplicația devine astfel extensibilă și interoperabilă cu diferite tipuri de aplicații client.

Există două tipuri de servicii web:

Vom utiliza serviciile REST pentru integrarea prin web și vom utiliza serviciile SOAP în aplicații enterprise ce au scenarii de integrare care cer calități avansate ale serviciilor (QoS) .

Vom alege JAX-RS pentru că serviciile sunt mai ușor de consumat pentru multe tipuri de clienți, în timp ce permite serverului să evolueze și să se scaleze. Clienții pot alege să consume anumite sau toate aspectele serviciului și să le combine cu alte servicii web.

Aplicațiile REST sunt simple, lightweight și rapide pentru că:

REST indică o arhitectură client server fără stare. Un serviciu REST expune o mulțime de resurse ce identifică destinațiile interacțiunilor cu clienții. Resursele sunt identificate prin URI și sunt manipulate de patru operații: PUT, GET, POST și DELETE.

Resursele sunt decuplate de reprezentare astfel încât pot fi accesate într-o varietate de formate: HTML, XML, plain text, PDF, JPEG și JSON. Metadatele despre resurse sunt folosite pentru a controla cache-ul, a detecta erorile de transmitere, a negocia cel mai potrivit format de reprezentare și pentru autentificare sau controlul accesului.

Orice interacțiune cu o resursă este stateless, mesajul este așadar self contained. Avem la dispoziție mai multe tehnici de a trimite starea precum: rescrierea URI-ului, cookie-uri, câmpuri hidden. Starea poate fi inclusă în mesajul de răspuns pentru a crea stări viitoare ale interacțiunii.

Clienții serviciului web, care doresc să folosească aceste resurse, accesează o anumită reprezentare prin transferarea conținutului aplicației folosind un mic set de metode remote ce descriu acțiunea ce trebuie făcută pe resursă.

În anumite cazuri acțiunile de update sau delete pot fi făcute prin POST, de e-xemplu când serviciul este consumat de browser-e ce nu suportă PUT sau DELETE). Următoarele mapări pot fi aplicabile pentru PUT sau POST:

Dezvoltarea unui serviciu web REST cu JAX-RS

JAX-RS este un API Java:

Jersey implementează suportul adnotațiilor definit de specificațiile JAX-RS.

O arhivă a aplicației Java EE conținând clasele resursăJAX-RS vor avea resursele configurate, clasele helper și artefactele generate și resursa expusă clienților prin deploy-ul unei arhive pe serverul de aplicație.

Fie următorul exemplu de fișier ce reprezintă codul clasei resursei root a unui serviciu web REST, ce utilizează adnotații JAX-RS:

package com.example.ws;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/hello")
public class Hello {
private String name="";

    /**
     * Default constructor. 
     */
    public Hello() {
        // TODO Auto-generated constructor stub
    }

    /**
     * Retrieves representation of an instance of 
     * Hello
     * @return an instance of String
     */
    @GET
    @Produces("text/plain")
    public String sayHello() {
        // TODO return proper representation object
    return "Hello World"+name;
    }

    /**
     * PUT method for updating or creating an
     * instance of Hello
     * @param content representation for the resource
     * @return an HTTP response with content of the 
     * updated or created resource.
     */
    @PUT
    @Consumes("text/plain")
    public void putText(String content) {
     name=content; 
    }
}

Adnotațiile utilizate sunt:

În Eclipse crearea structurii fișierului se face urmând pașii:

Proiectul în care am creat resursa este un Dynamic Web Project

Verificarea serviciului se face la adresa: http://localhost:8080/JerseyFirst/jaxrs/hello

Acest nume este derivat din valoarea tag-ului din web.xml, completat cu valoarea lui din (automat generate) și de valoarea adnotației @Path.

Crearea unui client

Jersey conține o bibliotecă REST ce poate fi utilizată pentru testarea sau crearea unui client Java.

Vom crea o Aplication Client Project, cu următorul cod:

import java.net.URI;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

public class Main {
  public static void main(String[] args) {
    ClientConfig config = new DefaultClientConfig();
    Client client = Client._create_(config);
    WebResource service = client.resource(_getBaseURI_());
                System._out_.println(service.path("jaxrs").path("hello").accept(MediaType._TEXT_PLAIN_).get(ClientResponse.class).toString());
System._out_.println(service.path("jaxrs").path("hello").accept(MediaType._TEXT_PLAIN_).get(String.class));
  }

  private static URI getBaseURI() {
    return UriBuilder._fromUri_("http://localhost:8080/JerseyFirst/").build();
  }
}

Arhitectura three-tier folosind REST este dată în diagrama următoare:

Pașii în generarea unui serviciu web REST sunt:

  1. Verificarea următoarelor condiții:

    • Jersey este adăugat proiectului;
    • JAX-RS API este adăugat proiectului.
  2. Generarea propriu zisă a serviciilor web:

Când testăm un serviciu web trebuie să avem în vedere următoarele:

Pașii de urmat pentru a dezvolta un client al serviciului web REST sunt:

Vom reveni în numerele viitoare ale revistei cu aplicații mai complexe, care să includă și interacțiunea cu o bază de date.

Vă dorim lectură plăcuta și așteptăm cu interes întrebările voastre!

NUMĂRUL 145 - Microservices

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects