Á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/3279126062824/newLayouttecnologia.css
Portuguese

Pagetitle
HTTPSPost
HTTPSPost

Função: HTTPSPost

Permite

...

emular

...

um

...

Client

...

HTTP

...

-

...

Hypertext

...

Transfer

...

Protocol,

...

utilizando

...

protocolo

...

HTTPS

...

através

...

de

...

uma

...

função

...

AdvPL,

...

postando

...

um

...

bloco

...

de

...

informações

...

para

...

um

...

determinado

...

documento

...

publicado

...

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

Bloco de código
collapsefalse
HTTPSPost( <
cUrl>
 cURL >, <
cCertificate>
 cCertificate >, <
cPrivKey>
 cPrivKey >, <
cPassPhrase>
 cPassword >, [ cGETParms ], [ cPOSTParms ], [ nTimeOut ], [ aHeadStr ], [ @cHeaderRet ], [
cHeaderRet
 lClient ] )
--> cReturn

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

...


cCertificate

...

caractere

Indica o path do arquivo, em formato PEM (modelo Apache), do arquivo que contém o certificado digital.

...

X

...


cPrivKey

...

caractere

Indica o path da chave privada, em formato PEM (modelo Apache), do arquivo que contém a chave privada, referente ao certificado digital

...

.

X

...


cPassword

...

caractere

...

Indica a senha que será utilizada para a abertura da chave privada.

...

Para uma chave privada que não possua senha

...

deve ser informada uma string vazia

...

.

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 é considerado vazio ("").

...



cPOSTParms

...

caractere

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 é 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.

...



cHeaderRet

...

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

lClient

...

 

lógico

Indica se o POST será feito pelo SmartClient (.T.) ou pelo AppServer (.F.). Valor padrão: .F..



Retorno

Nome

Tipo

Descrição

cRet

caractere

...

Retorna a string que corresponde

...

à requisição solicitada.

Informações
icontrue
titleObservações

O parâmetro

<cGetParms>

<cGetParms> representa uma lista de itens, separados por '&'. Pois, a mesma segue o formato URI - Uniform Resource Identiers: Query

Componet

Component.

Bloco de código
linenumbersfalse
collapsefalse
.
Exemplo: "param1=value1&m2=value2"
.

Neste caso, ao realizar

o POST

o POST para o endereço, este seria completado com os parâmetros Get.

Bloco de código
linenumbersfalse
collapsefalse
Exemplo: http://www.totvs.com?param1=
value1¶m2=value2
value1&m2=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 caso 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

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.

Ao utilizar a função HTTPSPost

()

, pode-se especificar um Content-Type diferenciado para o conteúdo postado. Caso não seja especificado um Content-Type, alguns servidores tratam a informação postada como sendo um dado do tipo 'application/x-www-form-url', seria o equivalente a um formulário HTML postado via browser. Desta forma, outros servidores poderão não reconhecer tal informação postada dessa forma.

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 'Content-Type: application/x-www-form-url'.

  
  • Caso o POST seja feito no AppServer e não for passado um caminho no environment para o parâmetro cCertificate, a aplicação será encerrada com uma exceção cuja mensagem será: "Only server path are allowed to Certificate on HttpSPost".
  • Caso o POST seja feito no AppServer e não for passado um caminho no environment para o parâmetro cPrivKey, a aplicação será encerrada com uma exceção cuja mensagem será: "Only server path are allowed to PrivKey on HttpSPost".
  • O parâmetro lClient está disponível a partir da build 7.00.131227A com data de geração superior a 17/03/2016.
  • 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

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
#include "totvs.ch"

user function TSTPostSSL()
  Local cURL
Importante
Função disponível, na linguagem AdvPL, para build superior a 7.00.090818P.

 

#INCLUDE "TOTVS.CH"
#INCLUDE "XMLCSVCS.CH"
User Function TSTPostSSL()
Local cUrl
 := "https://homologacao.nfe.fazenda.sp.gov.br:443/nfeWEB/services/NfeStatusServico.asmx"


  Local nTimeOut := 120
 
120  
 
 
Local aHeadOut := {}


  Local cHeadRet := ""


  Local 
sPostRet
cPostRet := ""


  
  // Acrescenta o UserAgent na requisição ...


  // http://tools.ietf.org/html/rfc3261#page-179

aadd(

  
  AAdd( aHeadOut, 'User-Agent: Mozilla/4.0 (compatible; Protheus ' + GetBuild() + ')'
)
sPostRet
 )
  cPostRet := 
HttpSPost
HTTPSPost(
cUrl
 cURL, "\certs\cert.pem", "\certs\privkey.pem", "pwdprivkey", "", "", nTimeOut, aHeadOut, @cHeadRet
)
IF Empty (sPostRet)    
    Conout("Ok HttpSPost")    
    Conout("WebPage", sPostRet)
ELSE    
    Conout("Fail HttpSPost. Verifique conf. de Proxy")    
    VarINFO("Header", cHeadRet)
ENDIF
Return
Protheus 10 , TOTVS Application Server 10 , ByYou Application Server
 
 )
  
  if Empty( cPostRet )
    conout( "Fail HTTPSPost" )
  else
    conout( "OK HTTPSPost" )
    varinfo( "WebPage", cPostRet )
  endif
  
  varinfo( "Header", cHeadRet )
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.

Nota
titleImportante

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).

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
#INCLUDE "TOTVS.CH"

user function httpsMD()
  Local cUrl := "http://ptsv2.com/t/totvstests/post"
  Local nTimeOut := 120
  Local aHeadOut := {}
  Local cHeadRet := ""
  Local cPostRet := ""
  
  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
  
  cPostRet := HTTPSPost( cURL, "\certs\cert.pem", "\certs\key.pem", "", "", cPostParms, nTimeOut, aHeadOut, @cHeadRet )
  varinfo("Header", cHeadRet)
  
  if !empty( cPostRet )
    conout( "HttpPost Ok" )
    varinfo( "WebPage", cPostRet )
  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 httpsMD2()
  Local cUrl := "http://ptsv2.com/t/totvstests/post"
  Local nTimeOut := 120
  Local aHeadOut := {}
  Local cHeadRet := ""
  Local cPostRet := ""
  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 + '--'
  
  cPostRet := HTTPSPost( cURL, "\certs\cert.pem", "\certs\key.pem", "", "", cPostParms, nTimeOut, aHeadOut, @cHeadRet )
  varinfo( "Header", cHeadRet )
  
  if !empty( cPostRet )
    conout( "HttpPost Ok" )
    varinfo( "WebPage", cPostRet )
  else
      conout("HttpPost Failed.")
  endif
return

Abrangência

Função disponível, na linguagem AdvPL, para build superior a 7.00.090818P.

Veja também