Hola foreros.
Os escribo porque tengo un problema, a ver si me podéis echar una manita.
No tengo ni idea de Delphi (soy programador web), estoy empezando y sé lo básico, básico, sin embargo en el trabajo me pidieron hacer un DataSnap Application Server sencillo y estoy descubriendo de a poco como va. He seguido varios ejemplos y no me ha funcionado ninguno.
Ahora estoy siguiendo la documentación oficial (debería haber empezado por ahí xD), concretamente este hilo de la docwiki -> Using a REST DataSnap Server with an Application and FireDAC (No puedo postear links)
El problema me viene al principio, que se supone que se crearán 3 componentes, ServerUnit, WebModuleUnit y ServerMethods. Pero al guardar el proyecto ServerMethods no se me crea. Pero bueno, continuo con los ejemplos como si nada, sin embargo al llegar a declarar las funciones que tienen que ver con los JSON me da el siguiente error: "Undeclared Identifier 'TJSONDataSets'. Tengo que llamar a otro componente o algo? No entiendo porque no encuentra el identificador si se supone que lo declaro yo :( . Lo siento si la pregunta es muy estúpida, voy algo perdido.
Os dejo el código a continuación.
ServerUnit
Código Delphi
[-]unit ServerUnit;
interface
uses
Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.AppEvnts, Vcl.StdCtrls, IdHTTPWebBrokerBridge, Web.HTTPApp, Data.DB,
Datasnap.DBClient, Datasnap.DSConnect;
type
TForm1 = class(TForm)
ButtonStart: TButton;
ButtonStop: TButton;
EditPort: TEdit;
Label1: TLabel;
ApplicationEvents1: TApplicationEvents;
ButtonOpenBrowser: TButton;
DSProviderConnection1: TDSProviderConnection;
procedure FormCreate(Sender: TObject);
procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
procedure ButtonStartClick(Sender: TObject);
procedure ButtonStopClick(Sender: TObject);
procedure ButtonOpenBrowserClick(Sender: TObject);
private
FServer: TIdHTTPWebBrokerBridge;
procedure StartServer;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
WinApi.Windows, Winapi.ShellApi, Datasnap.DSSession;
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
ButtonStart.Enabled := not FServer.Active;
ButtonStop.Enabled := FServer.Active;
EditPort.Enabled := not FServer.Active;
end;
procedure TForm1.ButtonOpenBrowserClick(Sender: TObject);
var
LURL: string;
begin
StartServer;
LURL := Format('localhost(no me deja poner urls)', [EditPort.Text]);
ShellExecute(0,
nil,
PChar(LURL), nil, nil, SW_SHOWNOACTIVATE);
end;
procedure TForm1.ButtonStartClick(Sender: TObject);
begin
StartServer;
end;
procedure TerminateThreads;
begin
if TDSSessionManager.Instance <> nil then
TDSSessionManager.Instance.TerminateAllSessions;
end;
procedure TForm1.ButtonStopClick(Sender: TObject);
begin
TerminateThreads;
FServer.Active := False;
FServer.Bindings.Clear;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FServer := TIdHTTPWebBrokerBridge.Create(Self);
end;
procedure TForm1.StartServer;
begin
if not FServer.Active then
begin
FServer.Bindings.Clear;
FServer.DefaultPort := StrToInt(EditPort.Text);
FServer.Active := True;
end;
end;
end.
WebModuleUnit1
Código Delphi
[-]unit WebModuleUnit1;
interface
uses
System.SysUtils, System.Classes, Web.HTTPApp, Datasnap.DSHTTPCommon,
Datasnap.DSHTTPWebBroker, Datasnap.DSServer,
Web.WebFileDispatcher, Web.HTTPProd,
DataSnap.DSAuth,
Datasnap.DSProxyJavaScript, IPPeerServer, Datasnap.DSMetadata,
Datasnap.DSServerMetadata, Datasnap.DSClientMetadata,
Datasnap.DSCommonServer, Datasnap.DSHTTP, FireDAC.Stan.Intf,
FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool,
FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.IB, FireDAC.Phys.IBDef,
FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf,
FireDAC.DApt, FireDAC.Stan.StorageBin, FireDAC.Stan.StorageJSON, Data.DB,
FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.Comp.UI,
FireDAC.Phys.IBBase;
type
TWebModule1 = class(TWebModule)
DSHTTPWebDispatcher1: TDSHTTPWebDispatcher;
DSServer1: TDSServer;
WebFileDispatcher1: TWebFileDispatcher;
DSProxyGenerator1: TDSProxyGenerator;
DSServerMetaDataProvider1: TDSServerMetaDataProvider;
FDConnectionEMPLOYEE: TFDConnection;
FDPhysIBDriverLink1: TFDPhysIBDriverLink;
FDGUIxWaitCursor1: TFDGUIxWaitCursor;
FDQueryDepartmentNames: TFDQuery;
FDQueryDepartment: TFDQuery;
FDQueryDepartmentEmployees: TFDQuery;
FDStanStorageJSONLink1: TFDStanStorageJSONLink;
FDStanStorageBinLink1: TFDStanStorageBinLink;
procedure WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
procedure WebFileDispatcher1BeforeDispatch(Sender: TObject;
const AFileName: string; Request: TWebRequest; Response: TWebResponse;
var Handled: Boolean);
{$METHODINFO ON}
public
function GetDepartmentNames: TFDJSONDataSets;
end;
var
WebModuleClass: TComponentClass = TWebModule1;
implementation
{$R *.dfm}
uses Web.WebReq;
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
Response.Content :=
'' +
'DataSnap Server' +
'DataSnap Server' +
'';
end;
function TWebModule1.GetDepartmentNames: TFDJSONDataSets;
begin
FDQueryDepartmentNames.Active := False;
Result := TFDJSONDataSets.Create;
TFDJSONDataSetsWriter.ListAdd(Result, FDQueryDepartmentNames);
end;
procedure TWebModule1.WebFileDispatcher1BeforeDispatch(Sender: TObject;
const AFileName: string; Request: TWebRequest; Response: TWebResponse;
var Handled: Boolean);
var
D1, D2: TDateTime;
begin
Handled := False;
if SameFileName(ExtractFileName(AFileName), 'serverfunctions.js') then
if not FileExists(AFileName) or (FileAge(AFileName, D1) and FileAge(WebApplicationFileName, D2) and (D1 < D2)) then
begin
DSProxyGenerator1.TargetDirectory := ExtractFilePath(AFileName);
DSProxyGenerator1.TargetUnitName := ExtractFileName(AFileName);
DSProxyGenerator1.Write;
end;
end;
initialization
finalization
Web.WebReq.FreeWebModules;
end.