Histórico da Página
...
Bloco de código | ||
---|---|---|
| ||
HTTPSPost( < cURL >, < cCertificate >, < cPrivKey >, < cPassword >, [ cGETParms ], [ cPOSTParms ], [ nTimeOut ], [ aHeadStr ], [ @cHeaderRet ], [ lClient ] ) |
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> representa uma lista de itens, separados por '&'. Pois, a mesma segue o formato URI - Uniform Resource Identiers: Query Component.
Neste caso, ao realizar o 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 (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'.
|
Exemplos
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#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 Local aHeadOut := {} Local cHeadRet := "" Local cPostRet := "" // Acrescenta o UserAgent na requisição ... // http://tools.ietf.org/html/rfc3261#page-179 AAdd( aHeadOut, 'User-Agent: Mozilla/4.0 (compatible; Protheus ' + GetBuild() + ')' ) cPostRet := HTTPSPost( cURL, "\certs\cert.pem", "\certs\privkey.pem", "pwdprivkey", "", "", nTimeOut, aHeadOut, @cHeadRet ) if Empty( sPostRetcPostRet ) 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.
...