Method POST

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
cruz_brasil
Usuário Nível 2
Usuário Nível 2
Mensagens: 59
Registrado em: 12 Mar 2010 17:17
Localização: Coimbra - Portugal

Method POST

Mensagem 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
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Method POST

Mensagem 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...
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
cruz_brasil
Usuário Nível 2
Usuário Nível 2
Mensagens: 59
Registrado em: 12 Mar 2010 17:17
Localização: Coimbra - Portugal

Method POST

Mensagem 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)
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Method POST

Mensagem 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
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
cruz_brasil
Usuário Nível 2
Usuário Nível 2
Mensagens: 59
Registrado em: 12 Mar 2010 17:17
Localização: Coimbra - Portugal

Method POST

Mensagem 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.
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Method POST

Mensagem 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"
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
cruz_brasil
Usuário Nível 2
Usuário Nível 2
Mensagens: 59
Registrado em: 12 Mar 2010 17:17
Localização: Coimbra - Portugal

Method POST

Mensagem 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)
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Method POST

Mensagem 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
POST.png
Obg. abs.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Method POST

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Method POST

Mensagem 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..
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Method POST

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Method POST

Mensagem por wmanesco »

Estranho, nunca tive problema com a tip.. mas bom saber
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
cruz_brasil
Usuário Nível 2
Usuário Nível 2
Mensagens: 59
Registrado em: 12 Mar 2010 17:17
Localização: Coimbra - Portugal

Method POST

Mensagem 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.
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Method POST

Mensagem 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...
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Responder