Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Obtener los errores que devuelve un webservice (https://www.clubdelphi.com/foros/showthread.php?t=90839)

bucanero 14-09-2016 18:54:37

Obtener los errores que devuelve un webservice
 
Hola buenas tardes,

Ando otra vez liado con el tema de los WebService, y en particular con el componente THTTPRIO.
Se trata de que al hacer una determinada llamada al servidor externo, si la llamada o parámetros de la misma no están bien montados, el servidor devuelve un código de error, y junto al código de error también devuelve un XML con la información detallada de dicho error.

Esta información del error con los componente TIDHTTP los puedo capturar con el siguiente código sin mayor problemas, en particular la linea en negrita es la que contiene el XML con la información del error:

Código Delphi [-]
  with IdHTTP1 do
  try
    //XML con los parametros de la consulta
    Result := Post(AURL, Stream);
  except
    on E: EIdHTTPProtocolException do begin
      MemoResult.lines.add('ErrorCode: ' + IntToStr(E.errorCode));
      MemoResult.lines.add(E.message);
      //En errorMessage devuelve un XML con informacion del error
      MemoResult.lines.add(E.ErrorMessage);
    end;
    on E: Exception do begin
      MemoResult.lines.add(E.message);
    end;
  end;

pero al hacer la misma llamada al componente THTTPRIO solo obtengo el código del error que devuelve el servidor, con el mensaje del error, pero ya no consigo obtener la información del XML que devuelve en la misma petición. ¿Se puede obtener dicha información de alguna forma?

Gracias de antemano por vuestra ayuda
Un Saludo

bucanero 16-09-2016 13:01:38

Tras investigar un poco el tema del envío y recepción de datos por parte de los componentes implicados en THTTPRIO, veo que lo datos que necesito obtener no llegan nunca al componente, por la forma en que este esta construido.

El componente donde se reciben los datos es THTTPReqResp y la parte del código donde se reciben dichos datos es:

Código Delphi [-]
unit Soap.SOAPHTTPTrans;

...

procedure THTTPReqResp.Receive(Context: Integer; Resp: TStream; IsGet: Boolean);
const
  MaxStatusTest = 4096;
  MaxContentType= 1024;
var
  Size, Downloaded, Status, Len, Index: DWord;
  S: string;
{$IFDEF UNICODE}
  Bytes: TBytes;
{$ENDIF}
begin
  Len := SizeOf(Status);
  Index := 0;

  { Handle error }
  if HttpQueryInfo(Pointer(Context), HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER,
    @Status, Len, Index) and (Status >= 300) and (Status <> 500) then
  begin
    Index := 0;
    Size := MaxStatusTest;
    SetLength(S, Size);
    if HttpQueryInfo(Pointer(Context), HTTP_QUERY_STATUS_TEXT, @S[Low(string)], Size, Index) then
    begin
      SetLength(S, Size div sizeof(Char));
      raise ESOAPHTTPException.CreateFmt('%s (%d) - ''%s''', [S, Status, FURL], Status);
    end;
  end;

  { Ask for Content-Type }
  Size := MaxContentType;
  SetLength(FContentType, MaxContentType);
  if (HttpQueryInfo(Pointer(Context), HTTP_QUERY_CONTENT_TYPE, @FContentType[Low(string)], Size, Index)) then
    SetLength(FContentType, Size div sizeof(Char))
  else
    // Raise GetLastError!
    Check(True);

...

end;

Al recibir la respuesta si su estado no es 200 ( y en mi caso devuelve error 400) inmediatamente salta una excepcion en siguiente linea

Código Delphi [-]
raise ESOAPHTTPException.CreateFmt('%s (%d) - ''%s''', [S, Status, FURL], Status);

sin terminar ya de ejecutar la siguiente parte del código, que es la que realmente obtiene el contenido del mensaje.

¿Hay alguna forma de sobreescribir ese método en particular sin tener que modificar todo el componente?
O alguna otra forma de obtener el RAW completo de la respuesta que devuelve el servidor.


Gracias de nuevo por su tiempo
Un saludo


La franja horaria es GMT +2. Ahora son las 22:26:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi