Função: HTTPPost
Permite emular um client HTTP - Hypertext Transfer Protocol, através de uma função AdvPL, postando um bloco de informações para uma determinada URL em um servidor Web, utilizando o método POST, permitindo a passagem de parâmetros adicionais via URL e aguardando por um tempo determinado (time-out) pela resposta do servidor solicitado.
HTTPPost ( < cUrl>, [ cGETParms], [ cPOSTParms], [ nTimeOut], [ aHeadStr], [ @cHeaderRet] ) --> cReturn
Nome | Tipo | Descrição | Obrigatório | Referência |
cUrl | Caracter | Indica o endereço HTTP com a pasta e o documento solicitado. | X | |
cGETParms | Caracter | Indica uma string de parâmetros, do tipo GET, que serão enviados ao servidor HTTP através da URI. Caso não seja especificado,este parâmetro será considerado vazio (""). | ||
cPOSTParms | Caracter | Indica uma string de parâmetros, do tipo POST, que serão enviados ao servidor HTTP através do pacote HTTP. Caso não seja especificado, este parâmetro será considerado vazio (""). | ||
nTimeOut | Numérico | Indica o tempo, em segundos, máximo de inatividade permitido durante a recepção do documento. Caso não seja especificado,o valor assumido será de 120 segundos. | ||
aHeadStr | Vetor | Indica o array que contêm as strings que serão acrescentadas no header da requisição HTTP que será realizada. Vide observações de comportamento da função. | ||
cHeaderRet | Caracter | Indica a string que conterá o header de resposta HTTP enviado pelo servidor requisitado. Observação: A variável deve ser declarada como uma string vazia "" antes da chamada da função. | X |
- (caracter)
- Retorna a string que corresponde a requisição solicitada.
O parâmetro <cGETParms> representa uma lista de itens, separados por '&'. Pois, a mesma segue o formato URI - Uniform Resource Identiers: Query Componet.
Exemplo: "param1=value1¶m2=value2"
Neste caso, ao realizar o POST para o endereço, este seria completado com os parâmetros Get.
Exemplo http://www.totvs.com?param1=value1¶m2=value2
Caso não seja retornado o documento antes do término do time-out, especificado na chamada da função, ou não seja possível localizar o servidor; seja por falha de resolução de DNS ou por erro de sintaxe ao especificar a URL, a função retornará nulo (NIL).
Caso não seja possível acessar o documento como, por exemplo, o documento não existe, o retorno será uma string HTML com a mensagem de erro HTML enviada pelo servidor correspondente.
Os headers da requisição HTTP a ser enviada serão montados automaticamente, contendo o Host, Accept, e Content-Length. Caso o parâmetro aHeadStr não seja especificado, o cabeçalho http da requisição enviada será montado internamente especificando que o conteúdo postado deve ser tratado como "application/x-www-form-urlencoded", identificando ao destinatário da requisição que o conteúdo do pacote HTTP deve ser tratado como um post de um formulário html. Caso o parâmetro aHeadStr seja especificado, devemos acrescentar nele qual é o Content-type da requisição, pois sem esta informação alguns servidores de HTTP, inclusive o próprio Application Server Protheus configurado como HTTP Server, não reconhecerão o conteúdo postado como campos de um formulário.
Para especificar que o conteúdo postado deve ser tratado como um POST de formulário HTTP, deve-se passar no parâmetro <aHeadStr> um elemento contendo a informação 'Content-Type: application/x-www-form-urlencoded'
#INCLUDE "TOTVS.CH"
#INCLUDE "XMLCSVCS.CH"
user function tstpost()
Local cUrl := "http://www.google.com"
Local nTimeOut := 120
Local aHeadOut := {}
Local cHeadRet := ""
Local sPostRet := ""
aadd(aHeadOut,'User-Agent: Mozilla/4.0 (compatible; Protheus '+GetBuild()+')')
aadd(aHeadOut,'Content-Type: application/x-www-form-urlencoded')
sPostRet := HttpPost(cUrl,"REQUEST=1212","EXAMPLEFIELD=DUMMY",nTimeOut,aHeadOut,@cHeadRet)
if !empty(sPostRet)
conout("HttpPost Ok")
varinfo("WebPage", sPostRet)
else
conout("HttpPost Failed.")
varinfo("Header", cHeadRet)
Endif
Return