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 06-04-2019
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
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 10:07:20.
Responder Con Cita
  #2  
Antiguo 06-04-2019
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.918
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
  #3  
Antiguo 06-04-2019
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
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
  #4  
Antiguo 07-04-2019
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 529
Poder: 22
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
  #5  
Antiguo 02-01-2024
Badillo Badillo is offline
Miembro
 
Registrado: jun 2021
Posts: 43
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
  #6  
Antiguo 03-01-2024
pablog2k pablog2k is offline
Miembro
 
Registrado: may 2017
Posts: 88
Poder: 8
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
  #7  
Antiguo 03-01-2024
Badillo Badillo is offline
Miembro
 
Registrado: jun 2021
Posts: 43
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
  #8  
Antiguo 03-01-2024
Badillo Badillo is offline
Miembro
 
Registrado: jun 2021
Posts: 43
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
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
Incluir Headers de SOAP en web services Delphi 2010 Revow Delphi para la web 6 19-05-2015 23:32:59
invocar a una dll lestad Varios 3 07-03-2014 18:47:54
Como modificar los headers de un DBGrid yn4v4s OOP 3 16-07-2012 20:43:07
dbgrid con sub-headers samantha jones Varios 1 02-03-2005 21:30:25
Indicador de orden en los headers de un TListView walrus OOP 1 11-10-2004 19:50:30


La franja horaria es GMT +2. Ahora son las 12:47:52.


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