Página 1 de 1
Method POST
Enviado: 19 Dez 2016 11:58
por cruz_brasil
Bom dia pessoa,
Estou precisando colocar um metodo post para funcionar direto da minha aplicação em xHarbour, tenho tentado com "TIpClientHttp", "TUrl", "'Msxml2.ServerXMLHTTP.6.0". Mas não consigo o resultado desejado que consigo executando ele em HTML como no exemplo abaixo.
alguem já fez isso ou teria alguma idéia para me ajudar ?
Código: Selecionar todos
<html>
<head>
<title></title>
</head>
<boady>
<form action="http://sync.nfs-e.net/datacenter/include/nfw/importa_nfw/nfw_import_upload.php?eletron=1" method="post">
Loguin:<input type="text" name="login"><br>
Senha:<input type="text" name="senha"><br>
Cidade:<input type="text" name="cidade"><br>
File:<input type="text" name="f1"><br>
<input type="submit" value="Submit">
</form>
</boady>
</html>
Grato a todos,
M.Cruz
Method POST
Enviado: 19 Dez 2016 13:56
por wmanesco
Seria algo assim:
Código: Selecionar todos
FUNCTION EnviaPost( cLogin, cSenha, cCidade, cFile )
LOCAL cUrl:= "http://sync.nfs-e.net/datacenter/include/nfw/importa_nfw/nfw_import_upload.php"
LOCAL oUrl, hDados := hb_Hash()
LOCAL oHTTP
oUrl := TUrl():new( cUrl )
oUrl:addGetForm({"eletron" => "1"})
oHTTP := TIPClientHTTP():new( oUrl )
IF !oHTTP:open()
RETURN .F.
ENDIF
hDados["login"] := cLogin
hDados["senha"] := cSenha
hDados["cidade"] := cCidade
hDados["f1"] := cFile
IF !oHTTP:post( hDados )
RETURN .F.
ENDIF
RETURN .T.
OBS: Nao testei o código, deve ter possíveis erros, mas é basicamente isso...
Method POST
Enviado: 19 Dez 2016 14:22
por cruz_brasil
Eu tentei dessa forma também, mas quando chega no POST, recebo a msg de "Conection Closed" e o danado do "readAll()" sempre vem EMPTY
Meu teste:
Código: Selecionar todos
LOCAL cUrl:= "http://sync.nfs-e.net/datacenter/include/nfw/importa_nfw/nfw_import_upload.php"
LOCAL oUrl, hDados := HASH()
LOCAL oHTTP
oUrl := TUrl():new( cUrl )
oUrl:addGetForm({"eletron" => "1"})
oHTTP := TIPClientHTTP():new( oUrl )
hDados["login"] := '22222222222222'
hDados["senha"] := '222222'
hDados["cidade"] := '8683'
hDados["f1"] := '<xml></xml>'
IF oHTTP:open()
msginfo(oHttp:readAll())
IF !oHTTP:post( hDados )
SHOWMSG(oHTTP:lastErrorMessage())
RETURN .F.
ENDIF
msginfo(oHttp:readAll())
ENDIF
Na seguinte tentativa, ele me retorna a mesma resposta que se eu jogar a string do URL pelo navegador, dizendo que o codigo do municipio esta errado. mas usando o FORM html com as mesmas configurações ele responde corretamente.
Código: Selecionar todos
LOCAL oErro, oServer, oDOM
TRY
oServer:= xhb_CreateObject( "Msxml2.ServerXMLHTTP.6.0")
CATCH oErro
SHOWMSG_EDIT(VALTOPRG(oErro),'ERRO1')
RETURN(.F.)
END
TRY
oDOM:= xhb_CreateObject( "Msxml2.DOMDocument.6.0")
CATCH oErro
SHOWMSG_EDIT(VALTOPRG(oErro),'ERRO2')
RETURN(.F.)
END
oDOM:async:=.F.
oDOM:loadXML("<msg><id>1</id></msg>");
oServer:open("POST","http://sync.nfs-e.net/datacenter/include/nfw/importa_nfw/nfw_import_upload.php?cidade=8683&login=22222222222222&senha=222222222&f1=%3Cxml%3E%3C/xml%3E",.F.)
oServer:SetRequestHeader("Accept", "text/html, */*")
oServer:send(oDOM)
showmsg_edit(oServer:responseXML:xml)
Method POST
Enviado: 19 Dez 2016 15:17
por wmanesco
Aqui aconteceu algo assim, veja se o "oUrl" está com as propriedades corretas, se não tiver faça igual isso
Código: Selecionar todos
...
IF Empty( oUrl:cProto )
oUrl:cProto := "http"
oUrl:cServer := "sync.nfs-e.net" //ou "www.sync.nfs-e.net"
oUrl:cPath := "/datacenter/include/nfw/importa_nfw/nfw_import_upload.php"
ENDIF
//continuação do seu codigo
Method POST
Enviado: 19 Dez 2016 17:06
por cruz_brasil
Consegui fazer comunicar, muito obrigado wmanesco, mas o webservice agora reclama que não reconhece o arquivo: "Arquivo não importado ou não encontrado!"
estou mandando o parametro do arquivo em string:
Código: Selecionar todos
hQuery["f1"] := "<nfse><pesquisa><codigo_autenticidade>0000000000000000</codigo_autenticidade><numero>00</numero><serie>NFS-e</serie><cadastro>000000000</cadastro></pesquisa></nfse>"
Será que devo enviar em algum outro formato ?
o que seria correspondente a
Código: Selecionar todos
<td><input type="file" value="Send" id='f1' name='f1' /></td>
no xHarbour ?
Grato a todos.
Method POST
Enviado: 19 Dez 2016 18:30
por wmanesco
Ai vai depender do que webservice pede eu acho, vc tem o arquivo fisico? Por que me parece que ta certo assim, mas tenta dar um memoread("file") e colocar na variavel "f1"
Method POST
Enviado: 19 Dez 2016 20:12
por cruz_brasil
Bha! esse caso me deu um suador!
Obrigado pela ajuda wmanesco.
Consegui completar a tarefa, segue o código caso alguem precise no futuro:
Código: Selecionar todos
LOCAL oUrl, oCli
LOCAL hQUery := Hash()
TRY
oUrl = TUrl():New( 'http://sync.nfs-e.net/datacenter/include/nfw/importa_nfw/nfw_import_upload.php?eletron=1' )
CATCH
SHOWMSG('Erro ao criar a conexão','ERRO1')
RETURN(.F.)
END
IF !EMPTY( oUrl )
oCli = TIPClientHttp():New( oUrl )
IF !EMPTY( oCli )
oCli:nConnTimeout = -1
IF oCli:Open()
hQuery["login"] := "22222222222222"
hQuery["senha"] := "22222222222"
hQuery["cidade"] := "2222"
oCli:aAttachments:={{'f1',;
'c:\temp\teste.xml',;
''}}
oCli:cUserAgent:='Mozilla/3.0 (compatible; Indy Library)'
IF !oCli:PostMultiPart(hQuery)
SHOWMSG(oCli:lastErrorMessage,'ERRO2')
ELSE
::cNFSeResp:=oCli:ReadAll()
ENDIF
oCli:Close()
ENDIF
ENDIF
ENDIF
SHOWMSG_EDIT(::cNFSeResp)
Method POST
Enviado: 20 Dez 2016 10:40
por Kapiaba
Bom dia Cruz_brasil, uma dúvida: Esta rotina só funciona com Mozzila Fire Fox ou com qualquer Navegador de Internet?
Código: Selecionar todos
#include "FiveWin.ch"
FUNCTION Main()
LOCAL oUrl, oCli, cNFSeResp
LOCAL hQUery := Hash()
TRY
oUrl = TUrl():New( 'http://sync.nfs-e.net/datacenter/include/nfw/importa_nfw/nfw_import_upload.php?eletron=1' )
CATCH
SHOWMSG('Erro ao criar a conexão com o Site da nfs-e','ERRO1')
RETURN(.F.)
END
IF !EMPTY( oUrl )
oCli = TIPClientHttp():New( oUrl )
IF !EMPTY( oCli )
oCli:nConnTimeout = -1
IF oCli:Open()
hQuery["login"] := "22222222222222"
hQuery["senha"] := "22222222222"
hQuery["cidade"] := "2222"
oCli:aAttachments:={{'f1',;
'c:\temp\teste.xml',;
''}}
oCli:cUserAgent:='Mozilla/3.0 (compatible; Indy Library)'
IF !oCli:PostMultiPart(hQuery)
SHOWMSG(oCli:lastErrorMessage,'ERRO2')
ELSE
//::cNFSeResp:=oCli:ReadAll()
cNFSeResp := oCli:ReadAll()
ENDIF
oCli:Close()
ENDIF
ENDIF
ENDIF
//SHOWMSG_EDIT(::cNFSeResp )
SHOWMSG_EDIT( cNFSeResp, "Atencao!" )
RETURN NIL
STATIC FUNCTION ShowMsg( cMsg, cTitle )
MsgInfo( cMsg, cTitle )
RETURN NIL
STATIC FUNCTION ShowMsg_Edit( cMsg, cTitle )
MsgInfo( cMsg, cTitle )
RETURN NIL

Obg. abs.
Method POST
Enviado: 20 Dez 2016 20:53
por JoséQuintas
Não seria isto?
Código: Selecionar todos
FUNCTION DownloadTexto( cUrl )
LOCAL oSoap, cRetorno, aRetorno, nAscii
cRetorno := ""
BEGIN SEQUENCE WITH __BreakBlock()
oSoap := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
oSoap:Open( "GET", cUrl, .F.)
oSoap:Send()
aRetorno := oSoap:ResponseBody()
IF ValType( aRetorno ) == "C"
cRetorno := aRetorno
ELSE
cRetorno := ""
FOR EACH nAscii IN aRetorno
cRetorno += Chr( nAscii )
NEXT
ENDIF
END SEQUENCE
RETURN cRetorno
Só alterando de GET para POST ?
Nota:
Num Harbour antigo, ou xHarbour, não lembro mais, o retorno era em BYTE ARRAY, que seria um array com ASCII em cada elemento.
Até hoje mantenho a conversão, nunca me preocupei em confirmar se ainda precisa disso.
Caso seja um EXE, por exemplo, só usar hb_MemoWrit( cFile, cRetorno )
Nota2:
Lembrando que XML pode conter ENTER no meio, se não me engano na assinatura, talvez isso possa atrapalhar.
Method POST
Enviado: 21 Dez 2016 12:03
por wmanesco
Acho que esse código também funciona, mas acredito que a tipclient seja melhor em alguns sentidos, tipo tratamento de erros.. não sei qual tem o melhor desempenho..
Method POST
Enviado: 21 Dez 2016 13:11
por JoséQuintas
Eu uso os dois: tipclient só pra ter gráfico, e o outro quando tipclient não funciona.
Minha atualização do aplicativo é assim há muito tempo, e acontece da tipclient falhar de vez em quando.
É... falha de vez em quando baixando sempre o mesmo EXE***, do mesmo site, na mesma máquina....
***versões novas do EXE, lógico.
Method POST
Enviado: 21 Dez 2016 17:35
por wmanesco
Estranho, nunca tive problema com a tip.. mas bom saber
Method POST
Enviado: 26 Dez 2016 18:13
por cruz_brasil
Oi Kapiaba, desculpa a demora.
Eu utilizei esse "Mozilla/3.0 (compatible; Indy Library)", pq é a pedido do manual da NFSe que estava desenvolvendo, mas acho que pode alterar para oq vc precisar.
Method POST
Enviado: 26 Dez 2016 23:35
por wmanesco
Kapiaba, acredito que isso não interfere não, na própria tipclient ele já seta isso por default caso não seja passado nada...