Ver la Versión Completa : Enviar datos a PHP y leer resultados (pagina ajena)
dosher81
08-04-2018, 16:32:02
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!!!
Hola,
Puedes utilizar el componente "IdHttp" que viene con los componentes Indy (http://www.indyproject.org/index.en.aspx), 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, 05:39:41
Mil Gracias! voy a probarlo :)
dosher81
10-04-2018, 08: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:
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!!
Hola a todos,
La clase "TIdSSLIOHandlerSocketOpenSSL" se declara en la unidad "IdSSLOpenSSL.pas".
dosher81
10-04-2018, 14:20:19
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, 17: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.
<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/49260327/delphi-idhttpssl-get-403-forbidden-from-server
https://stackoverflow.com/questions/39545080/tidhttp-and-tls-sni-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
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, 07: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
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.