Pregunta
· 19 sep, 2022

Recuperar el HttpStatus de una respuesta usando EnsLib.HTTP.OutboundAdapter

Hola comunidad,

Tengo que hacer un desarrollo que deberá de conectar con un REST API externo y devuelve diferentes HttpStatus y contenido en la respuesta con la descripción del problema.

Estoy usando el siguiente código:

set tSC = ..Adapter.SendFormDataArray(.tHttpResponse,"POST",tHttpRequest,,,URL)

Si la API externa respuende un estado 400 (Bad Request)

el valor de tSC es un status de error y el valor de tHttpResponse está vacio, por lo que no puedo comprobar cual es el código de estado y el contenido.

tSC="0 "_$lb($lb(5002,"<WRITE>zSend+120^%Net.HttpRequest.1",,,,,,,,$lb(,"MYAPP",$lb("$^zSend+120^%Net.HttpRequest.1 +1","$^zSendFormDataArray+64^EnsLib.HTTP.OutboundAdapter.1 +1","$^zCallService+61^MyApp.BO.REST.Base.1 +1","$^zSearch+1^MyApp.BO.REST.Providor.1 +1","$^zMessageHandler+6^MyApp.BO.REST.Providor.1 +1","$^zMessageHeaderHandler+23^MyApp.BO.REST.Providor.1 +1","$^zOnTask+42^Ens.Host.1 +1","D^zStart+62^Ens.Job.1 +2","D^StartEnsembleJob+6^|""%SYS""|STU +1"))))/* ERROR #5002: Error de cache: <WRITE>zSend+120^%Net.HttpRequest.1 */

¿Hay alguna manera de recuperar el HttpStatus de la respuesta?

Saludos cordiales,

Product version: IRIS 2021.1
$ZV: IRIS for Windows (x86-64) 2021.1 (Build 215U) Wed Jun 9 2021 09:39:22 ED
Comentarios (2)2
Inicie sesión o regístrese para continuar

Hola Curro,

Creo que el error que te devuelve en el tSC de Adapter.SendFormDataArray() no se corresponde con el error 402 de la API.
el tSC indica un error en el "<WRITE>" al hacer el envio sobre el pipe TCP en zSend+120^%Net.HttpRequest.1: Esto ocurre en el envio, antes de leer cualquier cabecera de respuesta.
Puede ser indicativo de un error en:

- el Host, port definido en el Adapter/BO no es el correcto

- Hay un problema al abrir un canal TCP desde IRIS hacia este host/puerto

Aquí un ejemplo de procesamiento de HttpStatus que he copiado de un entorno en producción:
 

   set tSC=..Adapter.SendFormDataArray(.tHttpResponse,"POST",.tHttpRequest,tVars,.tData,tURL)
          
    $$$TRACE("Code:"_tHttpResponse.StatusCode)
	set pResponse.code=tHttpResponse.StatusCode
	
	if $isobject(tHttpResponse.Data) {
		set tData=tHttpResponse.Data.Read(3200000)
	}else {			
	    set tData=tHttpResponse.Data
	}
	$$$TRACE("Data:"_tData)
	

Muchas gracias,

Efectivamente el problema estaba siendo originado porque la dirección al que se va a conectar es variable, por lo que no está configurado el componente con el parámetro de Server ni URL.

Lo he solucionado de la siguiente forma:
 

set ..Adapter.HTTPServer = pRequest.Url
Set URL = pRequest.Url_"/search"
set tHttpResponse = ##class(%Net.HttpResponse).%New()
set tSC = ..Adapter.SendFormDataArray(.tHttpResponse,"POST",tHttpRequest,,,URL)

if $$$ISERR(tSC) && (tHttpResponse="") $$$ThrowStatus(tSC)
// Comprobamos cual es el código de respuesta
set contenido = ""
while (tHttpResponse.Data.AtEnd = 0) { 
    set contenido = contenido_tHttpResponse.Data.Read() 
}

do pResponse.%JSONImport(contenido)
set pResponse.StatusCode = tHttpResponse.StatusCode

Muchas gracias por la respuesta.

Un saludo,
Kurro Lopez