Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-11-2020
juramisa juramisa is offline
Miembro
 
Registrado: abr 2007
Posts: 54
Poder: 18
juramisa Va por buen camino
Buenos días,

Ayer lo sospechaba, y hoy me lo han confirmado.

Hemos visto que el fichero xml, que está dentro del fichero gz que nos han enviado, tiene la codificación UTF-8 con BOM cuando debería ser UTF-8:


Y claro esos caracteres iniciales al convertir el TicketBai a base64 son por lo mismo. ¿Vosotros como realizáis la grabación de los XML en UTF-8 solamente? sin BOM.

Gracias
Responder Con Cita
  #2  
Antiguo 11-11-2020
juramisa juramisa is offline
Miembro
 
Registrado: abr 2007
Posts: 54
Poder: 18
juramisa Va por buen camino
Buenos días

Ya está todo solucionado, hasta la siguiente.

Si alguien más tiene el mismo problema os cuento como lo he solucionado. Rebuscando por internet he encontrado este código.

Código Delphi [-]
interface

  procedure SaveAsUTF8(const Fichero: string; Data: TStrings);

type
  TUTF8NoBOMEncoding = class(TUTF8Encoding)
  public
    function GetPreamble: TBytes; override;
  end;

implementation

function TUTF8NoBOMEncoding.GetPreamble: TBytes;
begin
  SetLength(Result, 0);
end;

  procedure SaveAsUTF8(const Fichero: string; Data: TStrings);
  var
    fs: TFileStream;
    vStreamWriter: TStreamWriter;
    Enc : TUTF8NoBOMEncoding;
  begin
    fs := TFileStream.Create(Fichero, fmCreate);
    try
      Enc := TUTF8NoBOMEncoding.Create;
//      vStreamWriter := TStreamWriter.Create(fs, TEncoding.UTF8);
      vStreamWriter := TStreamWriter.Create(fs, Enc);
      try
        vStreamWriter.Write(Data.Text);
      finally
        vStreamWriter.Free;
      end;
    finally
      fs.free;
      Enc.Free;
    end;

  end;

En el caso del TicketBai tras la firma lo vuelvo a cargar, y lo vuelvo a guardar.

Código Delphi [-]
      result := LoadXMLDocument(mi_fichero);
   // result: IXMLDocument

      SaveAsUTF8(mi_fichero, result.XML);

En el caso del LROE lo guardo antes de generar el GZip.

Código Delphi [-]
      
      SaveAsUTF8(mi_fichero, result.XML);

Resultado, envío correcto.

Muchas gracias a todos por vuestra ayuda.
Responder Con Cita
  #3  
Antiguo 11-11-2020
juramisa juramisa is offline
Miembro
 
Registrado: abr 2007
Posts: 54
Poder: 18
juramisa Va por buen camino
Alternativa NetHttpClient

Buenos días

Os presento una alternativa a NetHttpClient, quien tiene los componentes de SecureBlackBox 2020 DE.

Código Delphi [-]
var
  CertificateStorage: TsbxCertificateStorage;
  cert : TsbxCertificate;
  otros_parametros : string;
  encontrado : Boolean;
  Cuerpo_Mensaje : TFileStream;

  Entry: TSBxArchivedFile;



procedure....
      // Fichero LROE  GZip
      Cuerpo_Mensaje := TFileStream.Create(FicheroComprimido, fmOpenRead);
      // Cargar mensaje json
      el_eus_bizkaia_n3_data := f_cabecera_LROE(el_concepto, el_subcapitulo, DMBatu.CDSPres.FieldByName('PR020').AsString, 
                          DMBatu.CDSPres.FieldByName('PR040').AsString, DMBatu.CDSPres.FieldByName('PR090').AsString, 
                          DMBatu.CDSPres.FieldByName('PR100').AsString, DMBatu.CDSPres.FieldByName('PR080').AsString, IntToStr(ejercicio_presentacion.Value));
      // Selección del cerificado
      sbxHTTPClient1.TLSSettings.AutoValidateCertificates :=   True;
      CertificateStorage := TsbxCertificateStorage.Create(nil);
      if CertificateStorage.Opened then
         CertificateStorage.Close(True);
      CertificateStorage.Open('system://currentuser@localhost/?store=MY');
      encontrado := False;
      sbxHTTPClient1.ClientChain.Clear;
      for i := 0 to CertificateStorage.Certificates.Count - 1 do
      begin
        cert := CertificateStorage.Certificates[i];
        if bintostr(Cert.SerialNumber) = mi_certificadoID.Caption then
        begin
          sbxHTTPClient1.ClientChain.Add(cert);
          encontrado := True;
        end;
      end;
      if not encontrado then
      begin
        Application.MessageBox('Firma no encontrada',
          'Proceso de firma', MB_OK + MB_ICONWARNING
          + MB_DEFBUTTON2);
        Exit;
      end;
      // Carga parámetros cabecera   
      sbxHTTPClient1.RequestParameters.ContentType       := el_Content_Type;
      otros_parametros := 'Accept-Encoding: '             + el_accept_Encoding              + #13#10
                        + 'Content-Encoding: '            + el_Content_Encoding             + #13#10
                        + 'eus-bizkaia-n3-version: '      + el_eus_bizkaia_n3_version       + #13#10
                        + 'eus-bizkaia-n3-content-type: ' + el_eus_bizkaia_n3_content_type  + #13#10
                        + 'eus-bizkaia-n3-data: '         + el_eus_bizkaia_n3_data                  ;
      sbxHTTPClient1.RequestParameters.CustomHeaders := otros_parametros;
      // HTTP
      case rg_Entorno.ItemIndex of
        0: sbxHTTPClient1.PostStream(la_url_pruebas, Cuerpo_Mensaje);
        1: sbxHTTPClient1.PostStream(la_url, Cuerpo_Mensaje);
      end;
      // sbxHTTPClient1.OutputBytes nos devuelve el cuerpo respuesta
      // Guardo el fichero GZIP
      FicheroRespuesta := DMBatu.CDSEnvc.FieldByName('EN070').AsString +'.gz';
      GuardarRespuesta(FicheroRespuesta,sbxHTTPClient1.OutputBytes);
      // Descomprimo el fichero GZIP
      if sbxArchiveReader1.Opened then
         sbxArchiveReader1.Close;

      sbxArchiveReader1.Open(Integer(aftGzip), FicheroRespuesta);

      for i := 0 to sbxArchiveReader1.Files.Count - 1 do
      begin
        Entry := sbxArchiveReader1.Files[i];
        sbxArchiveReader1.Extract(Entry.Path, ExtractFilePath(DMBatu.CDSEnvc.FieldByName('EN070').AsString), false);
        Application.ProcessMessages;
        RenameFile(ExtractFilePath(DMBatu.CDSEnvc.FieldByName('EN070').AsString) + Entry.Path, DMBatu.CDSEnvc.FieldByName('EN070').AsString);
        Application.ProcessMessages;
      end;
      // Tratamiento de la respuesta
      XMLDocument1 := TXMLDocument.Create(nil);

      XMLDocument1.Active := False;
      XMLDocument1.XML.Clear;
      XMLDocument1.LoadFromFile(DMBatu.CDSEnvc.FieldByName('EN070').AsString);

      XMLDocument1.Active := True;
.......

      procedure GuardarRespuesta(const Fichero: String; Respuesta: TBytes);
      var
        stream: TBytesStream;
      begin
        stream := TBytesStream.Create(Respuesta);
        try
          stream.SaveToFile(Fichero);
        finally
          stream.Free;
        end;
      end;

Última edición por Casimiro Notevi fecha: 11-11-2020 a las 17:12:08.
Responder Con Cita
  #4  
Antiguo 12-11-2020
Avatar de elcharlie
elcharlie elcharlie is offline
Miembro
 
Registrado: mar 2013
Ubicación: Bilbao
Posts: 174
Poder: 12
elcharlie Va por buen camino
Cita:
Empezado por juramisa Ver Mensaje
Buenos días

Os presento una alternativa a NetHttpClient, quien tiene los componentes de SecureBlackBox 2020 DE.
Gracias por el aporte.
Un pregunta, de esta manera, ¿ya no te da el mensaje de "Error sending data: (12030) La conexión con el servidor finalizó anormalmente"?
Es por curiosidad...
Un saludo.
Responder Con Cita
  #5  
Antiguo 12-11-2020
Avatar de keys
keys keys is offline
Miembro
 
Registrado: sep 2003
Ubicación: Bilbao
Posts: 1.035
Poder: 22
keys Va por buen camino
Hola a todos. No se si os pasa a vosotros, pero el fichero de respuesta lo tengo que descomprimir dos veces.

Un Saludo.
Responder Con Cita
  #6  
Antiguo 12-11-2020
juramisa juramisa is offline
Miembro
 
Registrado: abr 2007
Posts: 54
Poder: 18
juramisa Va por buen camino
Contestando a elcharlie, con el certificado que pide clave, sí, la primera vez me da errores. De todas formas lo estoy probando ahora, y el fichero me viene que no es un gzip.

Contestando a keys, descomprimiendo con SecureBlackBox, me ha ido a la primera. Salvo ahora, que parece que yo he tocado algo o el servidor me devuelve mal el cuerpo del mensaje.

Os seguiré informando.

Saludos
Responder Con Cita
  #7  
Antiguo 12-11-2020
Avatar de elcharlie
elcharlie elcharlie is offline
Miembro
 
Registrado: mar 2013
Ubicación: Bilbao
Posts: 174
Poder: 12
elcharlie Va por buen camino
Cita:
Empezado por keys Ver Mensaje
Hola a todos. No se si os pasa a vosotros, pero el fichero de respuesta lo tengo que descomprimir dos veces.

Un Saludo.
Si si, me pasa lo mismo.

Cita:
Empezado por juramisa Ver Mensaje
Contestando a elcharlie, con el certificado que pide clave, sí, la primera vez me da errores. De todas formas lo estoy probando ahora, y el fichero me viene que no es un gzip.

Contestando a keys, descomprimiendo con SecureBlackBox, me ha ido a la primera. Salvo ahora, que parece que yo he tocado algo o el servidor me devuelve mal el cuerpo del mensaje.

Os seguiré informando.

Saludos
Gracias por la info
Responder Con Cita
  #8  
Antiguo 12-11-2020
juramisa juramisa is offline
Miembro
 
Registrado: abr 2007
Posts: 54
Poder: 18
juramisa Va por buen camino
Cita:
Empezado por keys Ver Mensaje
Hola a todos. No se si os pasa a vosotros, pero el fichero de respuesta lo tengo que descomprimir dos veces.

Un Saludo.
Se te ha solucionado, ahora parece que va bien el servicio.

De todas formar prueba con lo siguiente si quieres, el código completo está en un mensaje anterior.

Código Delphi [-]
       if sbxArchiveReader1.Opened then
         sbxArchiveReader1.Close;

        sbxArchiveReader1.Open(Integer(aftGzip), FicheroRespuesta);

      // Sólo hay un fichero
      for i := 0 to sbxArchiveReader1.Files.Count - 1 do
      begin
        Entry := sbxArchiveReader1.Files[i];
        sbxArchiveReader1.Extract(Entry.Path, ExtractFilePath(el_fichero_a_recibir), false);
        Application.ProcessMessages;
        RenameFile(ExtractFilePath(el_fichero_a_recibir) + Entry.Path, el_fichero_a_recibir);
        Application.ProcessMessages;
      end;
Responder Con Cita
  #9  
Antiguo 12-11-2020
Avatar de keys
keys keys is offline
Miembro
 
Registrado: sep 2003
Ubicación: Bilbao
Posts: 1.035
Poder: 22
keys Va por buen camino
Gracias.

El problema lo tengo solucionado, lo descomprimo dos veces y punto.

Yo creo que le problema es del componente TnetHttpClient que es con el que estoy haciendo el envío.

La descompresión ya la estaba haciendo mas o menos como tu pones, pero la tengo que hacer dos veces y si la hago manualmente desde el windows tambien la tengo que hacer dos veces.

Un Saludo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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 3557 Hace 2 Semanas 17:42:47
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


La franja horaria es GMT +2. Ahora son las 07:37:04.


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
Copyright 1996-2007 Club Delphi