Árvore de páginas

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&param2=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&param2=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

Veja também

  • Sem rótulos