Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   REST CLIENT con certificado digital (https://www.clubdelphi.com/foros/showthread.php?t=94257)

keys 22-10-2019 13:18:05

REST CLIENT con certificado digital
 
Hola a todos, estoy intentando acceder a un servicio web de la AEAT para el envio de declaraciones. Estoy intentando acceder con los componentes de REST CLIENT (TRESTCLIENT, TRESTREQUEST), y el servicio requiere identificarse con un certificado digital.

No encuentro la forma de indicarle a los componentes el certificado que tienen que utilizar.

Si intento hacer la conexión me sale el error "Unspecified certificate from client". Lógicamente ya que no he indicado el certificado.

Alquien me puede dar una pista. Gracias.

Casimiro Notevi 22-10-2019 15:20:24

¿Has visto este hilo? puede que te sirva.

Javierus 22-10-2019 16:51:06

Mírate ésto:
https://forums.embarcadero.com/threa...ssageID=937474

A ver si te sirviese

No hay nada en todo ClubDelohi sobre este tema

Casimiro Notevi 22-10-2019 17:31:43

Poco, pero algo hay :D
Es un tema poco preguntado, ciertamente.

keys 23-10-2019 09:56:57

Lo primero Gracias.

No se trata del SII, se trata de un sistema que ha sacado la AEAT para presentar declaraciones informativas como el 347, 349, 190, etc ..... Hasta ahora solo lo podian utilizar las declaraciones de mas de 40000 declarados, pero ahora se puede por todas las empresas para presentarlas directamente. Por si ha alguien le interesa el link es https://www.agenciatributaria.es/AEA...l/General.html

Básicamente Consiste en enviar peticiones POST a un servidor, pero hay que identificarse con un certificado.

Lo estoy intentando hacer con los componentes TRESTCLIENT ya que son los que normalmente utilizo para esta cosas. Mirando los enlaces que habeis indicado, algunos ya los habia seguido, a partir del delphi Tokio se debe poder hacer con un helper.

TRESTClientHelper = class helper for TCustomRESTClient;

Pero no consigo hacerlo, mas o menos estoy por aqui.
Código Delphi [-]
     TRESTClientHelper = class helper for TCustomRESTClient
  private
    function GetNeedClientCertificateEvent: TNeedClientCertificateEvent;
    procedure SetNeedClientCertificateEvent(
      const Value: TNeedClientCertificateEvent);
  public
    property OnNeedClientCertificate: TNeedClientCertificateEvent read GetNeedClientCertificateEvent write SetNeedClientCertificateEvent;
  end;

Pero no consigo que al hacer el execute me pase por esos eventos.

Con otros componentes como los indy, TnetHttpClient parece que se puede hacer, pero me gustaria hacerlos con estos.

Gracias

dec 23-10-2019 11:35:59

Hola a todos,

Leyendo sobre los "helpers" aquí y aquí, no me queda claro que sea lo más apropiado para tu caso, puesto que además dices que "no consigues que pase por esos eventos". ¿No deberías utilizar los eventos de la clase en cuestión, sin más? O bien extender la clase, pero, no usando "helpers", de modo que puedas sobreescribir los métodos que te interesen. Ojo, que, tal vez esté equivocado y se pueda hacer con "helpers" tal como estás intentándolo... acaso algún compañero pueda aportar algo más de luz al asunto.

keys 23-10-2019 11:55:06

El problema es que la clase TRESTCLIENT no tiene esos eventos. Según he podido leer se hace con los helpers.

http://docwiki.embarcadero.com/Libra...STClientHelper

http://docwiki.embarcadero.com/Libra...tHelper_Events

dec 23-10-2019 19:13:23

Hola a todos,

Pero, entonces, ¿la definición del "helper" que has puesto arriba es la tuya propia? Pareciera que el propio Delphi ofrece dicho "helper"... de modo que tendrías que usarlo y no crear otro...

P.D. Prueba también a "derivar" de "TRESTRequest", acaso hasta de "TRESTClient"..., en lugar de "TCustomRESTClient"...

P.D.2. Parece que no voy por el buen camino... pero yo sí veo propiedades que acaso puedan usarse en "TCustomRESTClient", pero, no mediante un "helper",... sino derivando una clase de ahí... es más, el propio "TRESTClient", que deriva de "TCustomRESTClient", ofrece las propiedades que pareces necesitar:

Código Delphi [-]
  TRESTClient = class(TCustomRESTClient)
  published
    property Authenticator;
    property Accept;
    property AcceptCharset;
    property AcceptEncoding;
    property AllowCookies;
    property AutoCreateParams;
    property BaseURL;
    property ContentType;
    property FallbackCharsetEncoding;
    property Params;
    property HandleRedirects;
    property RedirectsWithGET;
    property SecureProtocols;
    property ProxyPassword;
    property ProxyPort;
    property ProxyServer;
    property ProxyUsername;
    property RaiseExceptionOn500;
    property SynchronizedEvents;
    property UserAgent;
    property OnHTTPProtocolError;
    property BindSource;
    property OnValidateCertificate;
    property OnNeedClientCertificate;
    property OnAuthEvent;
  end;

keys 24-10-2019 09:19:20

Hola.

Esas propiedades que indicas no estan en delphi Tokio, esa es la solución que dan para los delphi anteriores. Segun indica el siguiente enlace.

https://forums.embarcadero.com/threa...ssageID=937474

Código Delphi [-]
TRESTClient = class(TCustomRESTClient)
  published
    property Authenticator;
    property Accept;
    property AcceptCharset;
    property AcceptEncoding;
    property AllowCookies;
    property AutoCreateParams;
    property BaseURL;
    property ContentType;
    property FallbackCharsetEncoding;
    property Params;
    property HandleRedirects;
    property ProxyPassword;
    property ProxyPort;
    property ProxyServer;
    property ProxyUsername;
    property RaiseExceptionOn500;
    property SynchronizedEvents;
    property UserAgent;
    property OnHTTPProtocolError;
    property IPImplementationID;
    property BindSource;
    property OnValidateCertificate;
  end;

En cuanto al helper que sale en la ayuda no consigo encontrar en que unit esta. Por eso lo he añadido yo.

Lo he conseguido hacer con el componente TNetHTTPClient, que si tiene el evento NeedClientCertificate, pero sigo empeñado en hacerlo con los TRESTCLIENT.

Un Saludo.

dec 24-10-2019 10:11:43

Hola a todos,

Yo he mirado en Delphi 10.3. ¿Acaso no es posible hacerlo tal como quieres, sin más? Quiero decir, usando "helpers" creo que no podría hacerse, directamente, pues, como tú mismo ves, esos "métodos / eventos" no se disparan, puesto que un "helper" "añade", pero, "no hereda", si no me equivoco.

Ahora bien, por otro lado, dices que en tu versión de Delphi, no existen las propiedades que he mencionado... luego no podrías tampoco hacerlo usando "herencia", porque, simplemente, la clase de la que ibas a heredar no cuenta con los métodos / eventos que tú esperas.

Por eso digo que acaso no puedas hacerlo... al menos no con la versión de Delphi que estás usando...

keys 24-10-2019 13:14:09

Hola otra vez.

Yo creo que es un problema o error del delphi. Ese helper deberia estar definido en la unit REST.Client que es como indica la ayuda.

En la ayuda de delphi tokio http://docwiki.embarcadero.com/Libra...en/REST.Client aparece que contiene esa clase. Pero luego si accedemos a esa unit no esta definida.

En el delphi Rio, pone que la clase esta en Rest.Client http://docwiki.embarcadero.com/Libra...STClientHelper pero luego en es unit no esta http://docwiki.embarcadero.com/Libra...en/REST.Client definida.

Me tendré que dar por vencido y usare TNetHTTPClient.

dec 24-10-2019 13:38:06

Hola a todos,

Yo también creo que en la versión de Delphi que estás usando no están los métodos que necesitas en la clase de marras, sin embargo, sí están en Delphi 10.3, que, es en la versión de Delphi que yo estoy mirando. Tampoco aquí está el "helper", y, o me equivoco, o no podría usarse para lo que necesitas... pero es cierto que en la ayuda aparece como dices... lo que a mí me confunde un poco. Si yo tuviera que hacer lo que necesitas con la versión de Delphi que tengo entre manos, lo haría usando las propiedades / eventos de la clase en cuestión... no sería necesario "helper" alguno. Puede que en versiones anteriores de Delphi sí fuese necesario... de modo que podría usarse... y yo estoy equivocado respecto de que no pueda usarse.


La franja horaria es GMT +2. Ahora son las 16:30:50.

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