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

  1. Crear un nou projecte Delphi:
    • Obre Delphi i crea un nou projecte de tipus "Delphi REST Server".
  2. Configurar el servidor REST:
    • Afegeix els components necessaris per a la configuració del servidor REST, com TIdHTTPServer per gestionar les peticions HTTP.

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

  1. Crea un servei RESTful per gestionar una llista de clients.
  2. Implementa les operacions CRUD per als clients.

Exercici 2: Consumir un Servei RESTful

  1. Crea una aplicació Delphi que consumeixi el servei RESTful creat en l'exercici anterior.
  2. 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

Mòdul 2: Estructures de Control i Procediments

Mòdul 3: Treballant amb Dades

Mòdul 4: Programació Orientada a Objectes

Mòdul 5: Funcions Avançades de Delphi

Mòdul 6: Desenvolupament d'Interfícies Gràfiques amb VCL i FMX

Mòdul 7: Desenvolupament Web i Mòbil

Mòdul 8: Millors Pràctiques i Patrons de Disseny

Mòdul 9: Projecte Final

© Copyright 2024. Tots els drets reservats