Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   DataSnap Rest - React (https://www.clubdelphi.com/foros/showthread.php?t=96354)

alejozd 12-09-2023 18:19:03

DataSnap Rest - React
 
Hola a todos, estoy creando un proyecto Servidor DataSnap Rest en Delphi 10.2, he realizado el ejemplo de este servidor conectando a una base de datos Firebird 3.0
Este proyecto me crea un .exe , desde esta aplicación hay un botón para iniciar el servidor en el puerto 8080.
En este servidor DataSnap Rest expuse un método que se llama ListaProductos, al hacer la prueba funciona bien y responde en http://LocalHost:8080/datasnap/rest/...istaProductos/

Luego hice una aplicación React donde hago el consumo de ListaProductos, al correr la aplicación React, abre en chrome LocalHost:3000 y se ve la pagina html ; dentro de la pagina esta el botón "Lista de Productos", al hacer clic en este botón consume el método ListaProductos del DataSnap Rest http://LocalHost:8080/datasnap/rest/...istaProductos/

Despues compile la aplicación React para montarlo en el IIS de mi equipo. hice la prueba y la pagina web se ve en el navegador.
El problema surge ya que al hacer clic en el botón ListaProductos no trae el listado y veo en la consola que no puede acceder al método en al dirección http://LocalHost:8080/datasnap/rest/...istaProductos/
El error que se ve en la consola de google chrome es el siguiente:
Access to fetch at http://LocalHost:8080/Datasnap/rest/...ListaProductos from origin http://MyPCServer has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space private.

En el servidor DataSnap Rest tengo habilitado en el WebModuleBeforeDispatch de la siguiente manera:
Código:

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.SetCustomHeader('Access-Control-Allow-Origin','*'); 
 
  if Trim(Request.GetFieldByName('Access-Control-Request-Headers')) <> '' then begin
    Response.SetCustomHeader('Access-Control-Allow-Headers', Request.GetFieldByName('Access-Control-Request-Headers'));       
    Handled := True;
  end;
 
  if FServerFunctionInvokerAction <> nil then
    FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;

Ambas aplicaciones (Servidor y Cliente) están en el mismo servidor (MyPCServer)
Lo ideal es:
  • El servidor DataSnap Rest este a la escucha de las peticiones que haga el cliente React
  • EL cliente React funcione como una pagina en el navegador y la puedan acceder en la red local

Espero haber explicado bien el escenario, de antemano gracias por cualquier ayuda!

PepeLolo 26-09-2023 14:58:41

DataSnap Rest - React
 
Prueba con esto.
Código Delphi [-]


procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
 remoteIP := Request.RemoteAddr;
 Response.SetCustomHeader('Access-Control-Allow-Origin', '*');

 if trim(Request.GetFieldByName('Access-Control-Request-Headers')) <> '' then
  begin
   Response.SetCustomHeader('Access-Control-Allow-Headers', Request.GetFieldByName('Access-Control-Request-Headers'));
   Handled := True;
  end;

 if FServerFunctionInvokerAction <> nil then
  FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;

end;



procedure TWebModule1.DSServer1Connect(
  DSConnectEventObject: TDSConnectEventObject);
begin
  TDSSessionManager.GetThreadSession.PutData('RemoteAddr', remoteIP);
//  TDSSessionManager.GetThreadSession.GetData('RemoteAddr');
end;


Un saludo.


La franja horaria es GMT +2. Ahora son las 18:46:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi