Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Composition Setup
import.css=/download/attachments/6062824/tecnologia.css

Pagetitle
HttpPost
HttpPost

...

Nome

Tipo

Descrição

cRet

caractere

Retorna a string que corresponde a requisição solicitada.

Informações
icontrue
titleObservaçõ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

    Nota
    icontrue
    titleAtençã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'

Exemplos

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
#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
Nota
icontrue
titleAtençã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.

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
#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(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)
  if !empty(sPostRet)
    conout("HttpPost Ok ")
    varinfo("WebPage", sPostRet)
  else
    conout("HttpPost Failed.")
    varinfo("Header", cHeadRet)
  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 := ""
  aadd(aHeadOut,'User-Agent: Mozilla/4.0 (compatible; Protheus '+GetBuild()+')')
  aadd(Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryFbmu0bODj7UvfQEV')

  cPostParms += '------WebKitFormBoundaryFbmu0bODj7UvfQEV'
  cPostParms += CRLF
  cPostParms += 'Content-Disposition: form-data; name="login"'
  cPostParms += CRLF
  cPostParms += CRLF
  cPostParms += cUser
  cPostParms += CRLF
  cPostParms += '------WebKitFormBoundaryFbmu0bODj7UvfQEV'
  cPostParms += CRLF
  cPostParms += 'Content-Disposition: form-data; name="senha"'
  cPostParms += CRLF
  cPostParms += CRLF
  cPostParms += cPass
  cPostParms += CRLF
  cPostParms += '------WebKitFormBoundaryFbmu0bODj7UvfQEV'
  cPostParms += CRLF
  cPostParms += 'Content-Disposition: form-data; name="cidade"'
  cPostParms += CRLF
  cPostParms += CRLF
  cPostParms += cCodSiaf
  cPostParms += CRLF
  cPostParms += '------WebKitFormBoundaryFbmu0bODj7UvfQEV'
  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 += '------WebKitFormBoundaryFbmu0bODj7UvfQEV'

  sPostRet := HttpPost(cUrl,"",cPostParms,nTimeOut,aHeadOut,@cHeadRet)
  if !empty(sPostRet)
    conout("HttpPost Ok ")
    varinfo("WebPage", sPostRet)
  else
    conout("HttpPost Failed.")
    varinfo("Header", cHeadRet)
  Endif
Return

Veja também