Histórico da Página
Composition Setup |
---|
import.css=/download/attachments/3279126062824/newLayouttecnologia.css |
Portuguese |
Pagetitle | ||||
---|---|---|---|---|
|
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 | ||
---|---|---|
| ||
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 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||
O parâmetro <cGetParms><cGetParms> representa uma lista de itens, separados por '&'. Pois, a mesma segue o formato URI - Uniform Resource Identiers: Query ComponetComponent.
Neste caso, ao realizar o POSTo POST para o endereço, este seria completado com os parâmetros Get.
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 ( NILNil). 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'.
|
Exemplos
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#include "totvs.ch"
user function TSTPostSSL()
Local cURL
#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 := 120120 Local aHeadOut := {} Local cHeadRet := "" LocalsPostRet 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 | ||||
---|---|---|---|---|
| ||||
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 | ||
---|---|---|
| ||
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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#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.