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
TIdHTTPServerper 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
