HttpGet/HttpCGet no SmartClient HTML

Boa tarde!

Estou com uma dúvida quanto ao funcionamento das funções HttpGet e HttpCGet no SmartClient HTML.

Tenho uma função que consome um site que retorna um XML. Com o retorno desse site, utilizo a função XmlParser para consultar os nós do XML.

Existe também a opção de retornar em Json, ao invés de XML.

Pelo SmartClient Desktop o HttpGet funciona normalmente, enquanto pelo HTML ele retorna nulo. Tenho quase certeza que não será possível utilizar essas funções nesse ambiente, mas poderiam me confirmar se realmente é isso?

Existe alguma outra função que posso estar utilizando para obter o retorno do site via SmartClient HTML?

Grato pela atenção.

Exemplo da função:


cFindUrl := 'http://viacep.com.br/ws/02511000/xml/'
cUrl     := HttpCGet(cFindUrl)

If(ValType(cUrl) == 'U')  

   lRet := .F.

Else

   oXML := Xmlparser(cUrl, '', @cError, @cWarning)

Endif

Boa noite Giordano,

Realmente o Smartclient HTML tem uma peculiaridade na chamada da função HttpCGet, pois o cliente passa a ser o seu navegador.

O que você pode fazer, é utilizar a função HttpGet, que recebe exatamente os mesmos parâmetros, mas quem efetua a requisição é o servidor.

Para que você não precise ficar decidindo qual usar, uma opção seria encapsular ambas em uma função sua, lembrando que quando via JOB, a função HttpCGet também não pode ser utilizada.

Abaixo um exemplo dessa função:


//-------------------------------------------------------------------
/*/{Protheus.doc} getHTTP
Permite emular um client HTTP - Hypertext Transfer Protocol, através de uma função da linguagem AdvPL,
acessando um determinado documento HTML, publicado em um servidor Web, utilizando o método GET,
permitindo a passagem de parâmetros via URL e aguardando por um tempo determinado (time-out) pela resposta do servidor solicitado.

@param cUrl Indica o endereço HTTP com a pasta e o documento solicitado.

@param cGetParms Indica a lista de strings de parâmetros que serão enviadas ao servidor HTTP,
através da URI. Caso este parâmetro não seja especificado, o mesmo será considerado vazio ("").

@param nTimeOut Indica o tempo, em segundos, máximo de inatividade permitido durante a recepção do documento.
Caso este parâmetro não seja especificado, o valor padrão assumido será de 120 segundos (2 minutos).

@param aHeadStr Indica o array que contêm as strings que serão acrescentadas ao header da requisição que será realizada.
Utilizar "|" (pipes) para separação entre parâmetro e valor.

@param cHeaderGet Indica o retorno, através de referência, da header de resposta HTTP enviada pelo servidor requisitado.
Observação: A variável deve ser declarada antes da chamada da função.

@return cRet Retorna a string que corresponde a requisição solicitada.

@author Daniel Mendes
@since  23/03/2020
@version 1.0
/*/
//-------------------------------------------------------------------
user function getHTTP(cUrl, cGetParms, nTimeOut, aHeadStr, cHeaderGet)
local cRet as char
local nRemote as numeric

nRemote := GetRemoteType()

if nRemote == REMOTE_HTML .Or. nRemote == NO_REMOTE
    cRet := HttpGet(cUrl, cGetParms, nTimeOut, aHeadStr, @cHeaderGet)
else
    cRet := HttpCGet(cUrl, cGetParms, nTimeOut, aHeadStr, @cHeaderGet)
endif

return cRet

Com isso, basta chamar essa função, e ela vai utilizar e melhor função de GET conforme o clinte da thread, podendo ser chamada em JOB, Client tradicional ou navegador:


U_getHTTP('http://viacep.com.br/ws/02511000/xml/')


Documentações:

https://tdn.totvs.com/display/tec/HTTPGet

https://tdn.totvs.com/display/tec/HTTPCGet

Obrigado pela resposta, Daniel. Muito bem explicado. Consegui resolver essa forma.