Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-05-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
(TRESTRequest) Error al obtener PDF adjunto (Berlin)

Hola a todos.

Estoy tratando de descargar un PDF usando REST (TRESTClient, TRESTRequest y TRESTResponse).

Al ejecutar la solicitud, va hasta el recurso en la plataforma donde está la API y lo descarga, pero no lo muestra ya que genera el error:

Cita:
Project raised exception class EEncodingError with message 'No mapping for the Unicode character exists in the target multi-byte code page'.
Código Delphi [-]
/////////////////////////////////////////////////////////////////
//unit System.Net.HTTPClient

function THTTPResponse.ContentAsString(const AnEncoding: TEncoding): string;
begin
//Linea 2160
    try
      LReader.CopyFrom(LStream, 0); //Aquí el tamaño del stream es de 364510 bytes, lo que es correcto
      Result := LReader.DataString; //Esto llama SysUtils.GetString
    finally
      if LFreeLStream then
       LStream.Free;
    end;
end;

/////////////////////////////////////////////////////////////////
//unit System.SysUtils

function TEncoding.GetString(const Bytes: TBytes; ByteIndex, ByteCount: Integer): string;
var
  Len: Integer;
begin
//Linea 31441
  Len := GetCharCount(Bytes, ByteIndex, ByteCount); //El resultado de Len es 0
  if (ByteCount > 0) and (Len = 0) then
    raise EEncodingError.CreateRes(@SNoMappingForUnicodeCharacter); //Aquí genera el error
  SetLength(Result, Len);
  GetChars(@Bytes[ByteIndex], ByteCount, PChar(Result), Len);
end;

Estos son los componentes con los parámetros básicos de la solicitud
Código Delphi [-]
object RESTClient1: TRESTClient
  Accept = '*/*'
  AcceptCharset = 'UTF-8, *;q=0.8'
  AcceptEncoding = 'deflate, gzip'
  BaseURL = 'https://...'
  ContentType = 'application/octet-stream'
  Params = <>
  HandleRedirects = True
  RaiseExceptionOn500 = False
end
object RESTRequest1: TRESTRequest
  Accept = '*/*'
  AcceptEncoding = 'deflate, gzip'
  Client = RESTClient1
  Params = <
    item
      Kind = pkHTTPHEADER
      name = 'X-Who'
      Value = '...'
    end
    item
      Kind = pkHTTPHEADER
      name = 'Authorization'
      Options = [poDoNotEncode]
      Value = '...'
    end>
  Resource = 'Documents/LDF/RepresentacionGrafica/Binario'
  Response = RESTResponse1
  SynchronizedEvents = False
end
object RESTResponse1: TRESTResponse
  ContentType = 'application/octet-stream'
  ContentEncoding = 'deflate, gzip'
end

como muestro en la info que adjunto, he estado revisando algunas cosas pero debe ser que ya es viernes a las 17:05 o que la gripe me esta afectando. Pero no doy con la forma de obtener este PDF. (Desde un cliente REST de escritorio si funciona)

De ante mano muchas gracias por cualquier guía que me puedan dar.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #2  
Antiguo 30-05-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Al hacer debug, hice un ejercicio modificando el valor de "Len" por el tamaño del Stream obtenido.

Código Delphi [-]
/////////////////////////////////////////////////////////////////
//unit System.SysUtils

function TEncoding.GetString(const Bytes: TBytes; ByteIndex, ByteCount: Integer): string;
var
  Len: Integer;
begin
//Linea 31441
  Len := GetCharCount(Bytes, ByteIndex, ByteCount); //El resultado de Len es 0, lo modifiqué a 364510
  if (ByteCount > 0) and (Len = 0) then
    raise EEncodingError.CreateRes(@SNoMappingForUnicodeCharacter);
  SetLength(Result, Len);
  GetChars(@Bytes[ByteIndex], ByteCount, PChar(Result), Len);
end;

Al hacer esto funciona correctamente. Al parecer es el charset que acepta pero estos están establecidos como UTF-8, *;q=0.5 y el encoding en deflate, gzip, *;q=0

Sigo sin saber como solventar este error.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #3  
Antiguo 30-05-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Hola a todos nuevamente.

Ya lo pude solucionar y comparto con quien le pueda suceder lo mismo.

El cliente de REST valida la propiedad TRESTClient.FallbackCharsetEncoding que por defecto es "UTF-8" e intenta convertir el contenido en una cadena.

Como este contenido no es una cadena sino los datos binarios del PDF que estoy intentando descargar, entonces se debe modificar esta propiedad dejándola en blanco o estableciendo su valor a "raw".

de ahí en adelante solo queda guardarlo en disco.

Código Delphi [-]
  procedure SaveToFile(Response : TRESTResponse; FileName : TFileName);
    var
      lStream : TStringStream;
  begin
    lStream := TStringStream.Create;
    try
      lStream.WriteData(Response.RawBytes, Response.ContentLength);
      lStream.SaveToFile(FileName);
    finally
      FreeAndNil(lStream);
    end;
  end;
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Error al instalar C++ builder berlin BDWONG Varios 2 21-06-2016 17:21:04
Error en envío de mail con adjunto + Indy 10 agustibaldo Internet 8 23-01-2015 21:23:31
Socket error # 10060 connection time out (cuando adjunto archivos de mas de 500 kb) Avellas Internet 3 11-05-2014 23:56:29
Error al enviar mail con archivo adjunto cbothamley Internet 0 08-12-2006 04:56:45
Obtener un fichero adjunto a un nodo de un fichero XML muntasil Internet 0 18-07-2006 12:57:57


La franja horaria es GMT +2. Ahora son las 01:40:40.


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