![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
LROE Bizcaia - Indy HTTP
Hola a todos.
Antes que nada pido disculpas si cometo algún error ya que es mi primer mensaje en este foro. Necesito vuestra ayuda porque estoy bloqueado. Estoy intentando enviar a Bizcaia un fichero LROE 240 y para ello estoy utilizando Delphi 10.3 Rio y los componentes Indy HTTP y TIdSSLIOHandlerSocketOpenSSL. El fichero que estoy enviando es un gzip que contiene el xml según la documentación. El código que estoy usando es el siguiente: Código:
Me devuelve siempre error 400 - Bad request Las cabeceras que le paso creo que están bien. Las vuelco a un fichero para ver que envío y muestra lo siguiente: Accept-Encoding: gzip Content-Encoding: gzip Content-Type: octet-stream Content-Length: 8532 eus-bizkaia-n3-version: 1.0 eus-bizkaia-n3-content-type: application/xml eus-bizkaia-n3-data: {"con":"LROE","apa":"1.1","inte":{"nif":"A99800005","nrs":"SOFTWARE GARANTE TICKETBAI PRUEBA"},"drs":{"mode":"240","ejer":"2025"}} Alguien me puede explicar donde está el problema o algún trozo de código que me pueda ayudar. Muchas gracias a todos. |
|
#2
|
||||
|
||||
|
Cita:
Hola y bienvenido a los foros. Antes de continuar con tu respuesta, te comentaría que hicieras la prueba con los componentes REST que vienen con Delphi "se serie". Digamos que son más modernos, más sencillos de usar y son los recomendados por Embarcadero (dría que en la versión que tienes ya están disponibles). De todas formas, tienes bastantes códigos disponibles indexados en el mensaje #2 de este hilo. Aquí tienes códigos usando los componentes REST: https://www.clubdelphi.com/foros/sho...&postcount=406 Y aquí algunos con las Indy: https://www.clubdelphi.com/foros/sho...&postcount=946 https://www.clubdelphi.com/foros/sho...postcount=2300 https://www.clubdelphi.com/foros/sho...postcount=1811
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi ![]() P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
|
#3
|
||||
|
||||
|
Cita:
Esta es mi forma de hacerlo con INDY pero en Delphi 2007, tampoco creo que varié mucho. "cuerpo" es el cuerpo del envío, previamente convertido ya a GZIP. "data" son los datos de la empresa a pasar en JSON. "datosCertificado" no es más que un "record" con los datos que necesito del certificado. Observa que no envío "content-length" en la cabecera, lo quité porque si lo mandaba, daba error. Espero que te sirva para encontrar el problema. Código:
function IndyPostBatuz(cuerpo: TMemoryStream; data: string; datosCertificado: TDatosCertificado): IXMLDocument;
var IdHTTP: TIdHTTP;
LHandler: TIdSSLIOHandlerSocketOpenSSL;
rGetCertificado: TGetCertificado;
sRespuesta, slXML: TStringList;
msRespuesta: TMemoryStream;
sXML, sTipo, sCodigo, sMensaje: string;
begin
rGetCertificado := TGetCertificado.Create;
IdHTTP := TIdHTTP.Create(nil);
result := TXMLDocument.Create(nil);
try
// Configuramos la cabecera específica para Bizkaia
IdHTTP.Request.CustomHeaders.AddValue('Accept-Encoding', 'gzip');
IdHTTP.Request.CustomHeaders.AddValue('Content-Encoding', 'gzip');
//IdHTTP.Request.CustomHeaders.AddValue('Content-Length', IntToStr(cuerpo.Size)); // Finalmente, este dato no es necesario mandarlo, aparte de que si lo mandamos, da error
IdHTTP.Request.CustomHeaders.AddValue('Content-Type', 'application/octet-stream');
IdHTTP.Request.CustomHeaders.AddValue('eus-bizkaia-n3-version', '1.0');
IdHTTP.Request.CustomHeaders.AddValue('eus-bizkaia-n3-content-type', 'application/xml');
IdHTTP.Request.CustomHeaders.AddValue('eus-bizkaia-n3-data', data);
LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
LHandler.sslOptions.Method := sslvTLSv1_2;
LHandler.sslOptions.SSLVersions := [sslvTLSv1_2];
LHandler.SSLOptions.CertFile := rDatosCertificado.RutaCertificado; // Certificado de dispositivo a usar
LHandler.SSLOptions.KeyFile := rDatosCertificado.RutaCertificado; // Certificado de dispositivo a usar (el mismo que cerfile)
LHandler.OnGetPassword := rGetCertificado.hServidorGetPassword; // Cuando se solicite la clave, el evento se encarga de aportarla
IdHTTP.IOHandler := LHandler;
sRespuesta := TStringList.Create; // La respuesta la recogemos en un stringlist;
msRespuesta := TMemoryStream.Create; // Stream que va a recoger el contenido en gzip. Desgraciadamente, Indy no tiene un Post en el que tanto petición como respuesta puedan ser Stream.
try
sRespuesta.Append(IdHTTP.Post(xrTicketbai.URL, cuerpo, IndyTextEncoding_UTF8)); // Enviamos la petición y la recogemos en un StringList;
except
on E:Exception do
begin
ShowMessage(E.message);
end;
end;
sTipo := idHTTP.Response.RawHeaders.Values['eus-bizkaia-n3-tipo-respuesta']; // Tipo de Respuesta. Si todo ha ido bien, es "Correcto"
sCodigo := idHTTP.Response.RawHeaders.Values['eus-bizkaia-n3-codigo-respuesta']; // Si sTipo no es "Correcto" entonce viene el código de error
sMensaje := idHTTP.Response.RawHeaders.Values['eus-bizkaia-n3-mensaje-respuesta']; // y el mensaje de error correspondiente
sIdentificativoBatuz := idHTTP.Response.RawHeaders.Values['eus-bizkaia-n3-identificativo']; // Aquí recogemos el identificativo, que viene en la cabecera de la respuesta
if sCodigo <> '' then
begin
ShowMessage('Tipo de respuesta: '+sTipo+#13#10+
'Codigo de respuesta: '+sCodigo+#13#10+
'Mensaje de respuesta: '+sMensaje);
end;
sRespuesta.SaveToStream(msRespuesta); // Grabamos la respuesta en un Stream de memoria.
if msRespuesta.Size > 0 then
begin
msRespuesta.Position := 0; // Importante posicionarse en 0, para que se pueda descomprimir correctamente
sXML := gZipToxmlModeloStream(msRespuesta); // Descomprimimos el stream de la respuesta en un string
try
result.Active := False;
result.XML.Clear;
result.XML.Text := LimpiaRespuesta(sXML); // Pasamos el string de la respuesta a un txmldocument
finally
FreeAndNil(msRespuesta);
end;
end;
finally
LHandler.Free;
end;
finally
IdHTTP.Disconnect;
IdHTTP.Free;
end;
end;
|
|
#4
|
|||
|
|||
|
Muchísimas gracias YellowStone
Ahora si que me funciona. Me devuelve un error que puedo leer: eus-bizkaia-n3-identificativo: 113248123 eus-bizkaia-n3-mensaje-respuesta: No se encuentra el certificado del dispositivo dentro del censo de certificados de dispositivo de la DFB. El número de serie del certificado de dispositivo utilizado es: 616ac435f1f8d99862d144d96f27ce32 eus-bizkaia-n3-codigo-respuesta: N3_0000016 eus-bizkaia-n3-numero-registro: eus-bizkaia-n3-tipo-respuesta: Incorrecto Estoy usando el certificado suministrado por ellos, así que les preguntaré. Una vez mas, muchísimas gracias. |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice | newtron | Internet | 3716 | 19-01-2026 20:01:34 |
| Como utilizar la ayuda del nuevo Sistema Operativo | gluglu | Humor | 3 | 24-09-2007 09:39:05 |
| Aplicacion Agencia De Viajes | ArdiIIa | Varios | 9 | 20-01-2007 16:49:53 |
| El Vasco Aguirre | Al González | La Taberna | 5 | 26-05-2006 09:22:28 |
| Microsoft ha lanzado su nuevo sistema operativo | DarkByte | Humor | 0 | 25-01-2004 09:21:14 |
|