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
POST.png
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...