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.
Sintaxe
HttpPost( < cUrl >, [ cGetParms ], [ cPostParms ], [ nTimeOut ], [ aHeadStr ], [ @cHeaderGet ] )
Parâmetros
Nome | Tipo | Descrição | Obrigatório | Referência |
---|---|---|---|---|
cUrl | caractere | Indica o endereço HTTP com a pasta e o documento solicitado. | X | |
cGetParms | caractere | 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 | caractere | Indica uma string de parâmetros, do tipo POST, que serão enviados ao servidor HTTP através da URL. 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. | ||
cHeaderGet | caractere | Indica a string que conterá o header de resposta HTTP enviado pelo servidor requisitado. Observação: A variável deve ser declarada antes da chamada da função. | X |
Retorno
Nome | Tipo | Descrição |
---|---|---|
cRet | caractere | Retorna a string que corresponde a requisição solicitada. |
Observações
O parâmetro <cGETParms> representa uma lista de itens, separados por '&', e 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
Atenção
Para fazer a passagem de valores dos parâmetros de GET, utilize no valor do parâmetro a função Escape.
- 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'
- Campos 'Content-Length' não deverão ser acrescentados manualmente no cabeçalho HTTP via parâmetro <aHeadStr>; caso sejam acrescentados e indiquem tamanho do corpo da mensagem igual ao esperado, serão descartados silenciosamente; caso sejam acrescentados e indiquem tamanho do corpo da mensagem diferente do esperado, serão descartados e um aviso será gerado no log da aplicação.
Exemplos
#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 ) varinfo( "Header", cHeadRet ) if !empty( sPostRet ) conout( "HttpPost OK" ) varinfo( "WebPage", sPostRet ) else conout("HttpPost Failed.") endif return
Atenção
Para utilização do 'Content-Type: multipart/form-data' atente-se a formatação dos Parametros do Post (uma linha em branco deve ser inserida sempre antes do conteúdo de cada elemento).
É possível informar o boundary que será utilizado na transmissão utilizando a seguinte sintaxe: "Content-Type: multipart/form-data; boundary=MyBoundary"
Quando o filename é informado, o conteúdo do arquivo será carregado pelo Application Server e será enviado. Para correta interpretação da mensagem pelo server que receberá o conteúdo do POST é ideal que o Content-type seja especificado. Para lista dos content-types possíveis consulte: http://tdn.totvs.com/display/tec/Valores+de+Content-Types
Apenas paths relativos são suportados por questão de segurança. Arquivos devem estar abaixo do diretório RootPath.
Se na requisição existir o boundary a mesma não será formata pelo Application Server e será apenas repassada
Essa funcionalidade está disponível apenas em versões iguais ou superiores a: 13.1.3.44,13.2.3.44 e 17.3.0.13.
Importante
Caso seja necessário fazer o upload de arquivos usando POST, faça o encode do conteúdo para UTF-8 usando a função EncodeUTF8 e verifique o uso do Content-Type como application (ex: application/xml em vez de text/xml).
#INCLUDE "TOTVS.CH" #INCLUDE "XMLCSVCS.CH" user function tstpostMFormData() Local cUrl := "http://ptsv2.com/t/totvstests/post" Local nTimeOut := 120 Local aHeadOut := {} Local cHeadRet := "" Local sPostRet := "" AAdd( aHeadOut, 'User-Agent: Mozilla/4.0 (compatible; Protheus ' + GetBuild() + ')') // AAdd( aHeadOut, 'Content-Type: multipart/form-data; boundary=TotvsBoundaryTest' ) //Se desejar informar o boundary AAdd(aHeadOut,'Content-Type: multipart/form-data') cPostParms := 'Content-Disposition: form-data; name="FileTextExample"; filename="\Teste.txt" ' + CRLF //Envio de Arquivo especificando o Content-Type cPostParms += 'Content-Type: text/plain;' + CRLF // cPostParms += 'Content-Disposition: form-data; name="FileTextExample"; filename="\Teste.txt"' + CRLF //Envio de Arquivo sem espeficar o Content-Type cPostParms += 'Content-Disposition: form-data; name="someParam"' + CRLF + CRLF //Envio de paramentos. Obrigatório Linha em branco antes do conteúdo cPostParms += 'someParamValue' //Conteúdo do Parametro sPostRet := HttpPost( cUrl, "", cPostParms, nTimeOut, aHeadOut, @cHeadRet ) varinfo( "Header", cHeadRet ) if !empty( sPostRet ) conout( "HttpPost OK" ) varinfo( "WebPage", sPostRet ) else conout("HttpPost Failed.") endif return //Abaixo é exemplificado uma requisição que não é formatada pelo Application Server. //Isso é últi quando deseja-se montar o multipart manualmente em advpl. user function postMFData() Local cUrl := "http://ptsv2.com/t/totvstests/post" Local nTimeOut := 120 Local aHeadOut := {} Local cHeadRet := "" Local sPostRet := "" Local cPostParms := "" Local cUser := "totvs" Local cPass:= "totvs" Local cCodSiaf := "sp" Local cXML := "<root><test>Totvs</test></root>" Local cNameArq := "\Teste.txt" Local cBoundary := ----WebKitFormBoundaryFbmu0bODj7UvfQEV AAdd( aHeadOut, 'User-Agent: Mozilla/4.0 (compatible; Protheus ' + GetBuild() + ')' ) AAdd( aHeadOut, 'Content-Type: multipart/form-data; boundary=' + cBoundary ) cPostParms += '--' + cBoundary cPostParms += CRLF cPostParms += 'Content-Disposition: form-data; name="login"' cPostParms += CRLF cPostParms += CRLF cPostParms += cUser cPostParms += CRLF cPostParms += '--' + cBoundary cPostParms += CRLF cPostParms += 'Content-Disposition: form-data; name="senha"' cPostParms += CRLF cPostParms += CRLF cPostParms += cPass cPostParms += CRLF cPostParms += '--' + cBoundary cPostParms += CRLF cPostParms += 'Content-Disposition: form-data; name="cidade"' cPostParms += CRLF cPostParms += CRLF cPostParms += cCodSiaf cPostParms += CRLF cPostParms += '--' + cBoundary cPostParms += CRLF cPostParms += 'Content-Disposition: form-data; name="f1"; filename="'+cNameArq+'"' cPostParms += CRLF cPostParms += 'Content-Type: text/plain' cPostParms += CRLF cPostParms += CRLF cPostParms += cXML cPostParms += CRLF cPostParms += '--' + cBoundary + '--' sPostRet := HttpPost( cUrl, "", cPostParms, nTimeOut, aHeadOut, @cHeadRet ) varinfo( "Header", cHeadRet ) if !empty( sPostRet ) conout( "HttpPost OK" ) varinfo( "WebPage", sPostRet ) else conout("HttpPost Failed.") endif return