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 03-04-2019
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 21
IVAND Va por buen camino
Invocar un api rest con headers

Estimados amigos

Tengo una inquietud y es la conexion a un web service q se debe pasar un request , pero no logro hacerlo o no entiendo muy bien como configurar el componete IdHTTP1 para tal fin , aqui se ha hablado de varias formas de incovar este tema pero no logro hacerlo con estos headers


Contando con ustedes quedo a sus ordenes


URL

https://inprise.integral.ec/api/cons...=1308325354001

Nota : Estoy usando un sistema de ejemplo de nuesto amigo neptali
el error self.Fhttp.ResponseCode es -1



X-MANTISAPI-CODE eeXahKo8 -> headers

he intentado varias formas ejmplo
HeaderStr = 'X-MANTISAPI-CODE: eeXahKo8';
IdHttp1.Request.CustomHeaders.Values[HeaderStr];

sale eror IOHandler value is not valid
self.Fhttp.ResponseCode da como resultado -1

El ejemplo que utilizo es el de nuestro amigo neftali
__________________
IVAND

Última edición por IVAND fecha: 03-04-2019 a las 05:30:13.
Responder Con Cita
  #2  
Antiguo 03-04-2019
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 21
IVAND Va por buen camino
Unhappy

creo q el problema es porque no se como enviar estos argumentos

self.Fhttp.Request.CustomHeaders.Add('key=X-MANTISAPI-CODE'+'value='+'eeXahKo8') ;
__________________
IVAND
Responder Con Cita
  #3  
Antiguo 03-04-2019
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Lo siguiente parece funcionar como se espera:

Código Delphi [-]
IdHTTP1.Request.CustomHeaders.AddValue('X-MANTISAPI-CODE', 'eeXahKo8');
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 05-04-2019
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 21
IVAND Va por buen camino
Hola Dec

Gracias por tu respuesta y disculpa pero recien puedo entrar a revisar los correos

Mira uso indy 10.2.5 y delphi 2009 , esa propiedad que me indicas no aparece en mi version solo aparecen add y no funciona con esos dos parametros .
__________________
IVAND
Responder Con Cita
  #5  
Antiguo 05-04-2019
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Yo creo que uso Indy 10... pero es cierto que probé en Delphi 2007 (lo que tenía más a mano). Mira a ver si esto otro sirve, puesto que aquí parece funcionar también:

Código Delphi [-]
IdHTTP1.Request.CustomHeaders.Values['X-MANTISAPI-CODE'] := 'eeXahKo8';
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 06-04-2019
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 21
IVAND Va por buen camino
Gracias Dev , por tu amable dedicacion ,

Mira logre consumir el servicio de esta manera como es uan pagina https

agrege esto

Código Delphi [-]
procedure TForm1.btn1Click(Sender: TObject);
var
Urls:string ;
LHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  IdHTTP1.Request.CustomHeaders.Values['X-MANTISAPI-CODE'] := 'eeXahKo8';
  IdHTTP1.IOHandler:=LHandler;
  memo1.Lines.Add(IdHTTP1.Get('https://inprise.integral.ec/api/consulta-identificacion/?identificacion=1308325354001'));
end;

Recibo ya la informacion , pero de una manera muy rara , como si fuera una pagina web que se embebe en un navegador , los datos que debe emviar son

Código PHP:
to `json`">json</a>
                        </li>
                      
                        <li>
                          <a class="
js-tooltip format-option" href="/api/consulta-identificacion/?format=api&amp;identificacion=1308325354001" rel="nofollow" title="Make a GET request on the Consulta Datos Identificacion resource with the format set to `api`">api</a>
                        </li>
                      
                    </ul>
                  </div>
                
              </fieldset>
            </form>
          

          
            <form class="
button-form" action="/api/consulta-identificacion/?identificacion=1308325354001" data-method="OPTIONS">
              <button class="
btn btn-primary js-tooltip" title="Make an OPTIONS request on the Consulta Datos Identificacion resource">OPTIONS</button>
            </form>
          

          

          
          </div>

            <div class="
content-main" role="main"  aria-label="main content">
              <div class="
page-header">
                <h1>Consulta Datos Identificacion</h1>
              </div>
              <div style="
float:left">
                
                  <p></p>
                
              </div>

              

              <div class="
request-info" style="clearboth" aria-label="request info">
                <pre class="
prettyprint"><b>GET</b> /api/consulta-identificacion/?identificacion=1308325354001</pre>
              </div>

              <div class="
response-info" aria-label="response info">
                <pre class="
prettyprint"><span class="meta nocode"><b>HTTP 200 OK</b>
<b>Allow:</b> <span class="
lit">OPTIONS, GET</span>
<b>Content-Type:</b> <span class="
lit">application/json</span>
<b>Vary:</b> <span class="
lit">Accept</span>

</span>{
    &quot;tipo_contribuyente&quot;: &quot;PERSONAS NATURALES&quot;,
    &quot;actividad_economica&quot;: &quot;VENTA AL POR MAYOR DE MATERIALES DE CONSTRUCCIÓN: PIEDRA, ARENA, GRAVA, CEMENTO, ETCÉTERA.&quot;,
    &quot;clase_contribuyente&quot;: &quot;OTROS&quot;,
    &quot;estado_contribuyente&quot;: &quot;ACTIVO&quot;,
    &quot;nombres_completos&quot;: &quot;ANCHUNDIA DELGADO JOSE RAFAEL&quot;,
    &quot;direccion&quot;: &quot;MANABI/PORTOVIEJO/12 DE MARZO/RAMOS IDUARTE S/N TERCERA Y CUARTA TRANSVERSAL&quot;,
    &quot;nombre_comercial&quot;: &quot;DEPOSITO ANCHUNDIA&quot;,
    &quot;obligado&quot;: &quot;S&quot;
}</pre>
              </div>
            </div>

            
              

              
            
          
        </div><!-- /.content -->
      </div><!-- /.container -->
    </div><!-- ./wrapper -->

    

    
      <script>
        window.drf = {
          csrfHeaderName: "
X-CSRFTOKEN",
          csrfCookieName: "
csrftoken"
        };
      </script>
      <script src="
/static/rest_framework/js/jquery-1.12.4.min.4f252523d4af.js"></script>
      <script src="
/static/rest_framework/js/ajax-form.0ea6e6052ab5.js"></script>
      <script src="
/static/rest_framework/js/csrf.753b7a1f2ee7.js"></script>
      <script src="
/static/rest_framework/js/bootstrap.min.5869c96cc8f1.js"></script>
      <script src="
/static/rest_framework/js/prettify-min.709bfcc456c6.js"></script>
      <script src="
/static/rest_framework/js/default.b846d7d305c9.js"></script>
      <script>
        $(document).ready(function() {
          $('form').ajaxForm();
        });
      </script>
    

  </body>
  
</html> 
Cuando deberia enviar en JSON , este servicio esta probado en python, sera que me falta algo mas para darle formato en los indy o sera normal asi en delphi que retorne aunq en la web de neftaly un api rest devuelve un json tal cual debe ser


Nuevamente aprecio mucha tu ayuda , un abrazo
__________________
IVAND

Última edición por dec fecha: 06-04-2019 a las 10:42:59. Razón: Poner etiquetas DELPHI
Responder Con Cita
  #7  
Antiguo 06-04-2019
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

El resultado que obtienes implica que el servidor no está recibiendo la petición HTTP adecuada, puesto que además, probando en apitester.com, el servidor retorna un JSON, tal como se espera. He querido probar con Delphi y me he encontrado con el mismo problema que tú, exactamente.

He revisado la petición HTTP que realiza apitester.com, puesto que funciona como se espera, y, después de probar a cambiar el "User Agent" (sin resultado), he visto que con el "Accept" adecuado, la petición se lleva a cabo perfectamente, es decir, algo como lo siguiente funciona bien:

Código Delphi [-]
begin
  IdHTTP1.Request.Clear();
  IdHTTP1.Request.Accept := '*/*';
  IdHTTP1.Request.CustomHeaders.Values['X-MANTISAPI-CODE'] := 'eeXahKo8';
  ShowMessage(IdHTTP1.Get('https://inprise.integral.ec/api/consulta-identificacion/?identificacion=1308325354001'));
end;
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 06-04-2019 a las 11:07:20.
Responder Con Cita
  #8  
Antiguo 06-04-2019
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
IdHTTP1.Request.Accept := '*/*';
Eso es el MIME TYPE. '*/*' es demasiado amplio y puede el servidor web CAMBIAR SU RESPUESTA, si quieres usar JSON el correcto es: application/json.

Ademas, ten en cuenta la simetría con:

https://webmasters.stackexchange.com...e-http-headers
__________________
El malabarista.
Responder Con Cita
  #9  
Antiguo 06-04-2019
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Entonces, es posible que el "Accept" por defecto que use el componente "IdHttp" no sea el adecuado, y, cambiándolo por "*/*", funciona como se espera. Si funcionase también con "application/json", en efecto, tal vez sería más adecuado usar este en lugar del otro más genérico. Yo únicamente me fijé en cómo hacía la consulta el servicio que obtenía una respuesta correcta y traté de imitar la llamada HTTP.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #10  
Antiguo 07-04-2019
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 21
IVAND Va por buen camino
Efectivamente de los dos metodos funciona bien , muchas gracias a los dos , un fuerte abrazo ahora solo queda parsear el resultado

Gracias
__________________
IVAND
Responder Con Cita
  #11  
Antiguo 03-01-2024
Badillo Badillo is offline
Miembro
 
Registrado: jun 2021
Posts: 33
Poder: 0
Badillo Va por buen camino
Necesito su ayuda con este ejemplo

Estoy tratando de hacer una llamada a este API, para obtener del un JSON y así validar la información. Ajusté la función según lo que entendí del ejempo que debaten acá, pero cuando hace por conectarse emite el siguiente error:

raised exception class EIdOSSLUnderlyingCryptoError with message 'Error connecting with SSL.
error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

El código fuente de la función es:

Código Delphi [-]
function TValidateNPIForAPI.IsValidateNPIForAPI(aNumber, aNpiType, aTaxonomy :string): boolean;
var
  xResponse: TStringStream;
  xUrl, xParams: String;
  xJsonObj: TlkJSONbase;
  xCount: Integer;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
    Result := False;
    xUrl :=  'https://npiregistry.cms.hhs.gov/api/?version=2.1';
    xResponse := TStringStream.Create('');
    xJsonObj :=  TlkJSONbase.Create;

    if aNumber <> '' then
      xParams := xParams + '&number='+HttpEncode(aNumber);

    if aNpiType <> '' then
      xParams := xParams + '&enumeration_type='+HttpEncode(aNpiType);

    if aTaxonomy <> '' then
      xParams := xParams + '&taxonomy_description='+HttpEncode(aTaxonomy);

    try
      SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
      Fhttp := TIDHttp.Create(nil);
      Fhttp.IOHandler := SSLHandler;
      Fhttp.Request.Clear();
      Fhttp.Request.Accept := '*/*';
      Fhttp.Request.CustomHeaders.Values['X-MANTISAPI-CODE'] := 'eeXahKo8';
      Fhttp.Get(xUrl + xParams, xResponse);
      TlkJSONbase(xJsonObj) := TlkJSON.ParseText(xResponse.DataString);
      xCount := StrToInt(xJsonObj.Field['result_count'].Value);
      Result := (xCount > 0);
    finally
      xResponse.Free;
      xJsonObj.Free;
      Result := False;
    end;
end;

Como ejemplo en los parámetros pueden utilizar aNumber = '1871147520' y aNpiType = 'NPI-1'.

Gracias por su ayuda.
Responder Con Cita
  #12  
Antiguo 03-01-2024
pablog2k pablog2k is online now
Miembro
 
Registrado: may 2017
Posts: 83
Poder: 7
pablog2k Va por buen camino
probablemente te esté pasando que no estás enviando con TLS 1.2 ,que últimamente muchas APIS lo exigen.
Deberás usar los indy mas o menos actualizados, y con el componente TidSSLIOHandlerSocketOpenSSL decirle en sus SSLOptions que la SSLVersion es TLSv1_2
Responder Con Cita
  #13  
Antiguo 03-01-2024
Badillo Badillo is offline
Miembro
 
Registrado: jun 2021
Posts: 33
Poder: 0
Badillo Va por buen camino
Cita:
Empezado por pablog2k Ver Mensaje
probablemente te esté pasando que no estás enviando con TLS 1.2 ,que últimamente muchas APIS lo exigen.
Deberás usar los indy mas o menos actualizados, y con el componente TidSSLIOHandlerSocketOpenSSL decirle en sus SSLOptions que la SSLVersion es TLSv1_2
Gracias, por la idea Pablog2k, probaré y comento.
Responder Con Cita
  #14  
Antiguo 03-01-2024
Badillo Badillo is offline
Miembro
 
Registrado: jun 2021
Posts: 33
Poder: 0
Badillo Va por buen camino
Probé de esta otra forma y mismo error.

Saludos.

Probé de está otra forma, incluyendo lo que me comenta pablog2k y como resultado obtengo el mismo error:

Código Delphi [-]
function TValidateNPIForAPI.ValidateNPIForAPI(aNumber, aNpiType,
  aTaxonomy: string): boolean;
var
  AHTTP: TIdHTTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;
  xResponse: TStringStream;
  xUrl, xParams: String;
  xJsonObj: TlkJSONbase;
  xCount: Integer;
begin
  Result := False;
  xUrl :=  'https://npiregistry.cms.hhs.gov/api/?version=2.1';
  xResponse := TStringStream.Create('');
  xJsonObj :=  TlkJSONbase.Create;

  if aNumber <> '' then
    xParams := xParams + '&number='+HttpEncode(aNumber);

  if aNpiType <> '' then
    xParams := xParams + '&enumeration_type='+HttpEncode(aNpiType);

  if aTaxonomy <> '' then
    xParams := xParams + '&taxonomy_description='+HttpEncode(aTaxonomy);

  try
    AHTTP:= TIdHTTP.Create(nil);
    SSL:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);

    AHTTP.IOHandler:= SSL;
    AHTTP.AllowCookies:= True;
    AHTTP.HTTPOptions:= [hoForceEncodeParams];

    AHTTP.Request.BasicAuthentication:= True;

    AHTTP.Request.Accept:= 'application/json';
    AHTTP.Request.AcceptCharSet := 'utf-8';
    AHTTP.Request.ContentType:= 'application/json';
    AHTTP.Request.UserAgent:= 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0';
    AHTTP.Request.CharSet:= 'utf-8';

    SSL.SSLOptions.Method:= sslvSSLv23;
    SSL.SSLOptions.Mode:= sslmUnassigned;
    SSL.SSLOptions.VerifyMode:= [];
    SSL.SSLOptions.VerifyDepth:= 0;
    SSL.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_1, sslvSSLv23, sslvTLSv1];

    xParams := AHTTP.Get(xUrl + xParams);
    TlkJSONbase(xJsonObj) := TlkJSON.ParseText(xResponse.DataString);
    xCount := StrToInt(xJsonObj.Field['result_count'].Value);
    Result := (xCount > 0);
  finally
    xResponse.Free;
    xJsonObj.Free;
    SSL.Free;
    AHTTP.Free;
    Result := False;
  end;
end;

Gracias.
Responder Con Cita
  #15  
Antiguo 03-01-2024
pablog2k pablog2k is online now
Miembro
 
Registrado: may 2017
Posts: 83
Poder: 7
pablog2k Va por buen camino
pero tienes que forzar a que envíe por tls 1.2
cambia esto

SSL.SSLOptions.Method:= sslvTLSv1_2;
SSL.SSLOptions.Mode:= sslmUnassigned; (yo suelo poner sslmBoth y me funciona)
SSL.SSLOptions.VerifyMode:= [];
SSL.SSLOptions.VerifyDepth:= 0;
SSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
Responder Con Cita
  #16  
Antiguo 03-01-2024
Badillo Badillo is offline
Miembro
 
Registrado: jun 2021
Posts: 33
Poder: 0
Badillo Va por buen camino
Comparto una vía de solución.

Saludos,

Compartiré la vía con la que solucioné el problema de la llamada a la API.

Código Delphi [-]
unit MdNPI;

interface

uses
  System.SysUtils, System.Variants, System.Classes, System.UITypes,
  System.AnsiStrings, System.IOUtils, uLkJSON;

type

  TNPI = class(TObject)
  private
    { Private declarations }
    FBaseURL: string;
    FParams: string;
    FResponse: string;
    FResponseJson: TlkJSONbase;

    function CallAPI(aUrl: string): string;
  public
    { Public declarations }
    property BaseURL: string read FBaseURL write FBaseURL;
    property ResponseJson: TlkJSONbase read FResponseJson;

    constructor Create;
    function ValidateNPIForAPI(aNumber, aNpiType, aTaxonomy :string): boolean;
  end;

implementation

uses
  System.Character, Vcl.AxCtrls, Winapi.ActiveX, WinHttp_TLB, IdURI;

{ TNPI }

constructor TNPI.Create;
begin
  FBaseURL :=  'https://npiregistry.cms.hhs.gov/api/?version=2.1';
  FParams := '';
  FResponse := '';
  FResponseJson := TlkJSONbase.Create;
end;

function TNPI.CallAPI(aUrl: string): string;
var
  Http: IWinHttpRequest;
  HttpStringStream: TStringStream;
  HttpStream: IStream;
  OleStream: TOleStream;
begin
  Http := CoWinHttpRequest.Create;
  Http.Open('GET', aUrl, False);
  Http.Send(EmptyParam);

  if Http.Status = 200 then
  begin
    HttpStream := IUnknown(Http.ResponseStream) as IStream;
    OleStream  := TOleStream.Create(HttpStream);
    try
      HttpStringStream := TStringStream.Create('');
      try
        OleStream.Position:= 0;
        HttpStringStream.CopyFrom(OleStream, OleStream.Size);

        Result := HttpStringStream.DataString;
      finally
        HttpStringStream.Free;
      end;
    finally
      OleStream.Free;
    end;
  end;
end;

function TNPI.ValidateNPIForAPI(aNumber, aNpiType,
  aTaxonomy: string): boolean;
var
  xCount: Integer;
  xUrl: string;
begin
  try
    xCount := 0;

    if aNumber <> '' then
      FParams := FParams + '&number='+aNumber;

    if aNpiType <> '' then
      FParams := FParams + '&enumeration_type='+aNpiType;

    if aTaxonomy <> '' then
      FParams := FParams + '&taxonomy_description='+aTaxonomy;

    xUrl := TIdURI.URLEncode(FBaseURL + FParams);
    FResponse := CallAPI(xUrl);
    TlkJSONbase(FResponseJson) := TlkJSON.ParseText(FResponse);

    xCount := StrToInt(FResponseJson.Field['result_count'].Value);
  except
    on e: Exception do
      begin
        xCount := 0;
      end;
  end;

  Result := (xCount > 0);

end;

end.

Gracias.
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
Incluir Headers de SOAP en web services Delphi 2010 Revow Delphi para la web 6 20-05-2015 00:32:59
invocar a una dll lestad Varios 3 07-03-2014 19:47:54
Como modificar los headers de un DBGrid yn4v4s OOP 3 16-07-2012 21:43:07
dbgrid con sub-headers samantha jones Varios 1 02-03-2005 22:30:25
Indicador de orden en los headers de un TListView walrus OOP 1 11-10-2004 20:50:30


La franja horaria es GMT +2. Ahora son las 10:27:07.


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