Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Delphi para la web (https://www.clubdelphi.com/foros/forumdisplay.php?f=51)
-   -   Enviar datos a PHP y leer resultados (pagina ajena) (https://www.clubdelphi.com/foros/showthread.php?t=92982)

dosher81 08-04-2018 17:32:02

Enviar datos a PHP y leer resultados (pagina ajena)
 
Buenas a todos,

pues aunque ponga que soy nuevo la verdad es que sigo esta pagina desde hace mil años y ha sido mi principal base para solucionar mis problemas siempre pero esta vez no encuentro por donde seguir.

Estoy desarrollando una aplicación de autoescuelas y necesito consultar el resultado de los alumnos contra la pagina de trafico, para ellos tengo que enviarle una serie de datos, pulsar en enviar y obtener el resultado.

sinceramente no tengo ni idea de como puedo realizar esto desde delphi.

¿alguna idea?

gracias!!!

dec 08-04-2018 17:48:22

Hola,

Puedes utilizar el componente "IdHttp" que viene con los componentes Indy, seguramente, incluido ya en tu Delphi. El componente "IdHttp" implementa un cliente HTTP, con el que podrás hacer peticiones GET y POST a las URL de los scripts PHP que necesites, enviando valores y recibiendo la correspondiente respuesta del servidor. Si buscas por "IdHttp Indy Delphi" encontrarás más información.

dosher81 09-04-2018 06:39:41

Mil Gracias! voy a probarlo :)

dosher81 10-04-2018 09:07:51

sigo con la locura, no hay forma de hacerlo funcionar.

el problema es que la pagina web donde quiero acceder es https, con lo que tengo que utilizar ssl y aqui choco contra una pared con la que ya chocaron compañeros del foro y con la que no he encontrado solución hasta la fecha.

pongo algo de código:

Código Delphi [-]
uses: IdMultipartFormData,IdSSLOpenSSL;

procedure Tfautoescuela.FormCreate(Sender: TObject);
var
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin
///
 IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(self);
  with idSSLIOHandlerSocketOpenSSL1 do
    begin
      SSLOptions.Method := sslvSSLv2;
      SSLOptions.Mode := sslmUnassigned;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 0;
      //host := '';
    end;
   IdHTTP1 := TIdHTTP.Create(Self);
  with IdHTTP1 do
    begin
      IOHandler := IdSSLIOHandlerSocketOpenSSL1;
      AllowCookies := True;
      ProxyParams.BasicAuthentication := False;
      ProxyParams.ProxyPort := 0;
      Request.ContentLength := -1;
      Request.ContentRangeEnd := 0;
      Request.ContentRangeStart := 0;
      Request.Accept := 'text/html, */*';
      Request.BasicAuthentication := False;
      Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
      HTTPOptions := [hoForceEncodeParams];
    end;
End;

procedure Tfautoescuela.Button1Click(Sender: TObject);
var S: TStringList;
   M: TStream;
begin
 S := TStringList.Create;
 M := TMemoryStream.Create;
 try
   S.Values['nif'] := '455654654S';
   S.Values['fecha-exa'] := '04/01/2018';
   S.Values['tipo-exa'] := 'B';
   S.Values['fecha-nac'] := '18/02/1975';

   IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
   IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
   IdHTTP1.Post('https://aegranvia.es/resultados', S, M);
   Memo1.Lines.Add(Format('Response Code: %d', [IdHTTP1.ResponseCode]));
   Memo1.Lines.Add(Format('Response Text: %s', [IdHTTP1.ResponseText]));

   M.Position := 0;
   S.LoadFromStream(M);
   Memo1.Lines.AddStrings(S);
 finally
   S.Free;
   M.Free;
 end;

el problema es que TIdSSLIOHandlerSocketOpenSSL me dice undeclared identifier.

ya actualicé a indy10, he descarado las dll y sinceramente no se que mas le puedo hacer

¿se os ocurre algo?

mil gracias!!

dec 10-04-2018 09:24:21

Hola a todos,

La clase "TIdSSLIOHandlerSocketOpenSSL" se declara en la unidad "IdSSLOpenSSL.pas".

dosher81 10-04-2018 15:20:19

Cita:

La clase "TIdSSLIOHandlerSocketOpenSSL" se declara en la unidad "IdSSLOpenSSL.pas".
Gracias! Solucionado

le añadí ademas las dll´s necesarias para que funcionara y funcionó pero ahora tengo otro problema.

Ya me devuelve datos, el problema es que no ejecuta el php, simplemente me devuelve el código de la pagina pero la "ejecuta" o pulsa el boton buscar.

estoy atascado porque estoy muy muy verde en este tema y cuando mas leo mas me lio :(

¿alguna idea de porque no estará ejecutando?

gracias!

bucanero 10-04-2018 18:06:53

Hola Dosher81

quizás el problema viene del hecho de que estas lanzando los datos contra la misma URL que te los envía a ti, pero en realidad el formulario dentro de esa pagina HTML los envía a otra dirección distinta cuando pulsas sobre el botón enviar "../php/obtener-notas.php" . Prueba a enviarlos a esa nueva dirección. Por otra parte no añades el parámetro submit del propio formulario, y dependiendo de la validación es posible que lo tengas que insertar también.

Código:

<form name="form-resultados" id="form-resultados-id" action="../php/obtener-notas.php" method="post">
...
  <button type="submit" class="submit">Ver Resultados</button>
</form>

Por otra parte con las conexiones SSL y dependiendo de la configuración del servidor de la pagina web (en muchos servidores están configurados sin la opción SNI) y la versión de las INDY que tengas instaladas, puedes llegar a tener bastantes complicaciones para poder acceder. Las INDY en las versiones anteriores no están bien preparadas para las conexiones de tipo SSL y hay que aplicar distintos tratamientos. En estos enlaces se habla de este problema en particular:

https://stackoverflow.com/questions/...en-from-server
https://stackoverflow.com/questions/...ni-doesnt-work

Y la solución que proponen y yo estoy aplicando para este problema es esta, en particular en el evento StatusInfoEx del IdSSLIOHandlerSocketOpenSSL1 inserta el siguiente código, aunque aun hay sitios que se resisten y no consigo acceder

Código Delphi [-]
procedure TForm1.IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(
  ASender: TObject; const AsslSocket: PSSL; const AWhere, Aret: Integer;
  const AType, AMsg: string);
begin
  if (ASender is TIdSSLIOHandlerSocketOpenSSL) then
    SSL_set_tlsext_host_name(AsslSocket, (ASender as TIdSSLIOHandlerSocketOpenSSL).host);
end;

Un saludo

darkbits 04-06-2018 08:16:00

hola
dosher81 yo tambien estoy haciendo el mismo proyecto pero no se donde comenzar
porfa me podes compartir un ejemplo de como manehas httcli get o post

necesito autentificarme a una pagina y dentro del panel realizar insertar modificar y elimanar

te agradesco tu colaboracion


La franja horaria es GMT +2. Ahora son las 00:16:39.

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