En aquest tema, aprendrem sobre els serveis RESTful, una arquitectura àmpliament utilitzada per a la creació de serveis web. REST (Representational State Transfer) és un estil arquitectònic que utilitza els mètodes HTTP per interactuar amb recursos web. Els serveis RESTful són senzills, escalables i fàcils d'integrar amb altres sistemes.
Objectius del Tema
- Entendre els conceptes bàsics de REST.
- Aprendre a crear i consumir serveis RESTful amb Delphi.
- Implementar operacions CRUD (Create, Read, Update, Delete) utilitzant serveis RESTful.
- Gestionar respostes i errors en serveis RESTful.
Conceptes Bàsics de REST
Característiques de REST
- Client-Servidor: La separació de les preocupacions entre el client i el servidor.
- Sense Estat: Cada petició del client al servidor ha de contenir tota la informació necessària per entendre i processar la petició.
- Caché: Les respostes poden ser marcades com cachéables o no cachéables per millorar el rendiment.
- Interfície Uniforme: Utilitza mètodes HTTP estàndard (GET, POST, PUT, DELETE) per a les operacions.
- Sistema en Capes: L'arquitectura pot estar composta per múltiples capes, cada una amb una funció específica.
Mètodes HTTP
- GET: Recupera informació d'un recurs.
- POST: Crea un nou recurs.
- PUT: Actualitza un recurs existent.
- DELETE: Elimina un recurs.
Creació de Serveis RESTful amb Delphi
Configuració del Projecte
- Crear un nou projecte Delphi:
- Obre Delphi i crea un nou projecte de tipus "Delphi REST Server".
- Configurar el servidor REST:
- Afegeix els components necessaris per a la configuració del servidor REST, com
TIdHTTPServer
per gestionar les peticions HTTP.
- Afegeix els components necessaris per a la configuració del servidor REST, com
Exemple Pràctic: Implementació d'un Servei RESTful
1. Definició del Model de Dades
type TProduct = class private FID: Integer; FName: string; FPrice: Double; public property ID: Integer read FID write FID; property Name: string read FName write FName; property Price: Double read FPrice write FPrice; end;
2. Creació del Mòdul REST
type TProductResource = class(TDataModule) private FProducts: TObjectList<TProduct>; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure GetProducts(AContext: TWebContext); procedure GetProduct(AContext: TWebContext); procedure CreateProduct(AContext: TWebContext); procedure UpdateProduct(AContext: TWebContext); procedure DeleteProduct(AContext: TWebContext); end;
3. Implementació dels Mètodes REST
constructor TProductResource.Create(AOwner: TComponent); begin inherited; FProducts := TObjectList<TProduct>.Create; // Afegir productes de mostra FProducts.Add(TProduct.Create(1, 'Product 1', 10.0)); FProducts.Add(TProduct.Create(2, 'Product 2', 20.0)); end; destructor TProductResource.Destroy; begin FProducts.Free; inherited; end; procedure TProductResource.GetProducts(AContext: TWebContext); begin AContext.Response.Content := TJson.ObjectToJsonString(FProducts); end; procedure TProductResource.GetProduct(AContext: TWebContext); var LID: Integer; LProduct: TProduct; begin LID := AContext.Request.Params['id'].ToInteger; LProduct := FProducts.Find(LID); if Assigned(LProduct) then AContext.Response.Content := TJson.ObjectToJsonString(LProduct) else AContext.Response.StatusCode := 404; end; procedure TProductResource.CreateProduct(AContext: TWebContext); var LProduct: TProduct; begin LProduct := TJson.JsonToObject<TProduct>(AContext.Request.Body); FProducts.Add(LProduct); AContext.Response.StatusCode := 201; end; procedure TProductResource.UpdateProduct(AContext: TWebContext); var LID: Integer; LProduct: TProduct; begin LID := AContext.Request.Params['id'].ToInteger; LProduct := FProducts.Find(LID); if Assigned(LProduct) then begin TJson.JsonToObject(AContext.Request.Body, LProduct); AContext.Response.StatusCode := 200; end else AContext.Response.StatusCode := 404; end; procedure TProductResource.DeleteProduct(AContext: TWebContext); var LID: Integer; LProduct: TProduct; begin LID := AContext.Request.Params['id'].ToInteger; LProduct := FProducts.Find(LID); if Assigned(LProduct) then begin FProducts.Remove(LProduct); AContext.Response.StatusCode := 204; end else AContext.Response.StatusCode := 404; end;
Consumir Serveis RESTful amb Delphi
Exemple Pràctic: Consumir un Servei RESTful
procedure TForm1.Button1Click(Sender: TObject); var LClient: TRESTClient; LRequest: TRESTRequest; LResponse: TRESTResponse; begin LClient := TRESTClient.Create('http://localhost:8080/products'); LRequest := TRESTRequest.Create(nil); LResponse := TRESTResponse.Create(nil); LRequest.Client := LClient; LRequest.Response := LResponse; LRequest.Method := rmGET; LRequest.Execute; Memo1.Lines.Text := LResponse.Content; end;
Exercicis Pràctics
Exercici 1: Crear un Servei RESTful
- Crea un servei RESTful per gestionar una llista de clients.
- Implementa les operacions CRUD per als clients.
Exercici 2: Consumir un Servei RESTful
- Crea una aplicació Delphi que consumeixi el servei RESTful creat en l'exercici anterior.
- Mostra la llista de clients en un
TListBox
.
Solucions als Exercicis
Solució Exercici 1
type TClient = class private FID: Integer; FName: string; FEmail: string; public property ID: Integer read FID write FID; property Name: string read FName write FName; property Email: string read FEmail write FEmail; end; type TClientResource = class(TDataModule) private FClients: TObjectList<TClient>; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure GetClients(AContext: TWebContext); procedure GetClient(AContext: TWebContext); procedure CreateClient(AContext: TWebContext); procedure UpdateClient(AContext: TWebContext); procedure DeleteClient(AContext: TWebContext); end;
Solució Exercici 2
procedure TForm1.Button1Click(Sender: TObject); var LClient: TRESTClient; LRequest: TRESTRequest; LResponse: TRESTResponse; LClients: TArray<TClient>; LClientObj: TClient; begin LClient := TRESTClient.Create('http://localhost:8080/clients'); LRequest := TRESTRequest.Create(nil); LResponse := TRESTResponse.Create(nil); LRequest.Client := LClient; LRequest.Response := LResponse; LRequest.Method := rmGET; LRequest.Execute; LClients := TJson.JsonToObject<TArray<TClient>>(LResponse.Content); ListBox1.Items.Clear; for LClientObj in LClients do ListBox1.Items.Add(LClientObj.Name); end;
Resum
En aquest tema, hem après els conceptes bàsics de REST i com crear i consumir serveis RESTful amb Delphi. Hem implementat operacions CRUD i hem gestionat respostes i errors. Els exercicis pràctics ens han ajudat a consolidar els coneixements adquirits. En el proper tema, explorarem el desenvolupament mòbil amb Delphi.
Curs de Programació Delphi/Object Pascal
Mòdul 1: Introducció a Delphi/Object Pascal
- Introducció a Delphi i Object Pascal
- Configuració de l'Entorn de Desenvolupament
- Primera Aplicació Delphi
- Sintaxi i Estructura Bàsiques
- Variables i Tipus de Dades
Mòdul 2: Estructures de Control i Procediments
- Declaracions Condicionals
- Bucles i Iteració
- Procediments i Funcions
- Abast i Durada de les Variables
- Gestió d'Errors i Depuració
Mòdul 3: Treballant amb Dades
- Arrays i Cadenes
- Registres i Conjunts
- Tipus Enumerats i Subrang
- Gestió d'Arxius
- Accés a Bases de Dades
Mòdul 4: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Herència i Polimorfisme
- Interfícies i Classes Abstractes
- Gestió d'Excepcions en POO
Mòdul 5: Funcions Avançades de Delphi
- Generics i Col·leccions
- Multifil i Programació Paral·lela
- Desenvolupament Basat en Components
- Biblioteca d'Execució de Delphi (RTL)
- Tècniques Avançades de Depuració
Mòdul 6: Desenvolupament d'Interfícies Gràfiques amb VCL i FMX
- Introducció a VCL
- Creació de Formularis i Controls
- Programació Basada en Esdeveniments
- Introducció a FireMonkey (FMX)
- Desenvolupament Multiplataforma amb FMX
Mòdul 7: Desenvolupament Web i Mòbil
- Desenvolupament Web amb Delphi
- Serveis RESTful
- Desenvolupament Mòbil amb Delphi
- Desplegament d'Aplicacions Mòbils
- Integració amb Serveis Web
Mòdul 8: Millors Pràctiques i Patrons de Disseny
- Organització del Codi i Documentació
- Patrons de Disseny en Delphi
- Tècniques de Refactorització
- Proves Unitàries i Desenvolupament Basat en Proves
- Optimització del Rendiment