preciso de um help dos mestres aqui...
estou com um problema ao recuperar um xml retornado no Entity de uma requisição POST de uma API.
quando o XML retornado pela API é pequeno consigo recupera-lo normalmente
porem quando o XML retornado pela API é grande estou recebendo um erro referente ao tipo de conversão invalido .
---------------------------
Cast inválido do OpenEdge.Core.Memptr ao OpenEdge.Core.WidgetHandle. (12869)
faço a conversão dessa forma
hXml = CAST(oResponse:Entity, OpenEdge.Core.WidgetHandle):VALUE NO-ERROR.
de acordo com a mensagem meu CAST, nesse caso de XML grande, deveria ser para MEMPTR ao invés de WidgetHandle, então tratei o erro na conversão acima e fiz o CAST para memptr dessa forma.
ASSIGN oMemptrEntity = CAST( oResponse:Entity, OpenEdge.Core.MEMPTR).
ASSIGN C-ARQ = oMemptrEntity:GetString(1) NO-ERROR.
não recebi mais o erro em questão porem o xml que recebo do getString não vem completo... recebo apenas 2995 caracteres
fiz o consumo da API pelo Postman e, no Postman, o retorno é um xml completo com mais de 10000 caracteres,
então o problema acredito que esteja na forma como estou consumindo a API pelo Progress.
Alguém tem experiência em consumo de APIs que retornam XMLs pra me dar um help?
segue abaixo como monto minha requisição.
...
ASSIGN URL-API = "
https://consulta.maisfrete.com.br/api/index.php"
URL-HOST = "*
maisfrete.com.br".
ASSIGN oURI = URI:Parse(URL-API)
cClientId = 'Usuario'
cClientSecret = 'senha'
oCredentials = NEW Credentials(URL-HOST, cClientId, cClientSecret).
ASSIGN oStringMap = NEW StringStringMap().
oStringMap:PUT('conjunto_de_dados', tipoDados).
oStringMap:PUT('cnpj',CNPJ).
oStringMap:PUT('dt_ini',dt-Ini).
oStringMap:PUT('dt_fim',dt-Fim).
oStringMap:PUT('id', id).
oStringMap:PUT('ambiente',STRING(ambiente)).
ASSIGN oLib = ClientLibraryBuilder:Build():sslVerifyHost(YES):LIBRARY NO-ERROR.
ASSIGN oClient = ClientBuilder:Build():KeepCookies(CookieJarBuilder:Build():CookieJar):UsingLibrary(oLib):Client.
ASSIGN oRequest = RequestBuilder
:POST( oURI, oStringMap)
:UsingBasicAuthentication(oCredentials)
:REQUEST.
oResponse = ResponseBuilder:Build():Response.
oClient:EXECUTE(oRequest, oResponse) NO-ERROR.
IF oResponse:StatusCode <> 200 AND
oResponse:StatusCode <> 401 THEN
MESSAGE "REQUEST ERROR: " + STRING(oResponse:StatusCode).
ELSE DO:
DEFINE VARIABLE hXml AS HANDLE NO-UNDO.
DEFINE VARIABLE hNodeChild AS HANDLE NO-UNDO.
CREATE X-DOCUMENT hXml.
CREATE X-NODEREF hNodeChild.
ERROR-STATUS:ERROR = FALSE.
//CAST PARA WIDGET
hXml = CAST(oResponse:Entity, OpenEdge.Core.WidgetHandle):VALUE no-error.
IF ERROR-STATUS:ERROR AND ERROR-STATUS:NUM-MESSAGES > 0 THEN DO:
ERROR-STATUS:ERROR = FALSE.
// CAST PARA MEMPTR
ASSIGN oMemptrEntity = CAST( oResponse:Entity, OpenEdge.Core.MEMPTR).
ASSIGN C-ARQ = oMemptrEntity:GetString(1) NO-ERROR.
COPY-LOB FROM C-ARQ TO FILE ("C:\temp\teste.XML").
END.
END.