Página 1 de 2

Ajuda com webservice

Enviado: 19 Out 2015 23:08
por luiz antonio da silva
Boa Noite !

Estou com o seguinte problema:
Preciso enviar um arquivo xml para um webservice criado pela administradora do nosso ERP.

o xml é pequeno:
<FichaAnalise>
<U_DataIns>2015-10-18</U_DataIns>
<U_Data>2015-10-18</U_Data>
<U_Item>PG01012</U_Item>
<U_R_OP>OP</U_R_OP>
<U_Quantidade>10000</U_Quantidade>
<U_BatchNum>023/15</U_BatchNum>
<U_Ficha>2</U_Ficha>
<U_TipoAnal>3</U_TipoAnal>
<U_FormAnal>2</U_FormAnal>
<U_Aprovador>6</U_Aprovador>
<U_NumPN></U_NumPN>
<U_Safra>14/15</U_Safra>
<U_NumDoc>0</U_NumDoc>
</FichaAnalise>

o caminho do webservice:
http://localhost:9292/WebService1.asmx ... chaAnalise

Em um programa interno é coletado as informações do xml acima que será transmitido para o webservice que fará a inclusão dos dados no banco.

Já fiz vários testes com base nos exemplos de NFe, não deu muito certo, então....não tenho ideia de como montar o programa.

Alguém teria um exemplo (Sem ser exemplo de NFe..rsrs) pra ajudar ?

* Usando atualmente HMG 3.1.1 com SqlServer / Oracle

******
acessando o endereço pela rede tenho o seguinte retorno:

SOAP 1.1

O exemplo a seguir mostra uma solicitação e uma resposta SOAP 1.1. Os espaços reservados mostrados devem ser substituídos por valores reais.

POST /WebService1.asmx HTTP/1.1
Host: 187.72.11.129
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/InsereFichaAnalise"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<InsereFichaAnalise xmlns="http://tempuri.org/">
<CaminhoXML>string</CaminhoXML>
</InsereFichaAnalise>
</soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<InsereFichaAnaliseResponse xmlns="http://tempuri.org/">
<InsereFichaAnaliseResult />
</InsereFichaAnaliseResponse>
</soap:Body>
</soap:Envelope>
SOAP 1.2

O exemplo a seguir mostra uma solicitação e uma resposta SOAP 1.2. Os espaços reservados mostrados devem ser substituídos por valores reais.

POST /WebService1.asmx HTTP/1.1
Host: 187.72.11.129
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<InsereFichaAnalise xmlns="http://tempuri.org/">
<CaminhoXML>string</CaminhoXML>
</InsereFichaAnalise>
</soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<InsereFichaAnaliseResponse xmlns="http://tempuri.org/">
<InsereFichaAnaliseResult />
</InsereFichaAnaliseResponse>
</soap12:Body>
</soap12:Envelope>

Grato.
Luiz.

Ajuda com webservice

Enviado: 21 Out 2015 08:37
por Toledo
Amigo, sem fazer teste fica complicado tentar ajudar, mas segue um exemplo:

Código: Selecionar todos

Func EnviaXML(cXML)
Local cSOAPAction:="http://tempuri.org/InsereFichaAnalise", cMsgRet:=""
Local cUrlWS, oServerWS, oDOMDoc, cXMLResp, cxMLSoap

    cxMLSoap:='<?xml version="1.0" encoding="utf-8"?>'
    cxMLSoap+='<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'
    cxMLSoap+='<soap:Body>'
    cxMLSoap+='<InsereFichaAnalise xmlns="http://tempuri.org/">'
    cxMLSoap+='<CaminhoXML>'+cXML+'</CaminhoXML>'
    cxMLSoap+='</InsereFichaAnalise>'
    cxMLSoap+='</soap:Body>'
    cxMLSoap+='</soap:Envelope>'


    cUrlWS := 'http://localhost:9292/WebService1.asmx?wsdl'

    oServerWS = Win_oleCREATEOBJECT("MSXML2.ServerXMLHTTP.5.0")

    oServerWS:open("POST", cUrlWS, .F.)
    oServerWS:setRequestHeader("SOAPAction", cSOAPAction )
    oServerWS:setRequestHeader("Content-Type", "text/xml; charset=UTF-8")

    oDOMDoc = Win_oleCREATEOBJECT("MSXML2.DOMDocument.5.0")
    oDOMDoc:async = .F.
    oDOMDoc:validateOnParse  = .T.
    oDOMDoc:resolveExternals := .F.
    oDOMDoc:preserveWhiteSpace = .T.
    oDOMDoc:LoadXML(cxMLSoap)
    IF oDOMDoc:parseError:errorCode <> 0
      cMsgRet:='Erro: xML nao carregado'
    ENDIF
    IF Empt(cMsgRet)
      TRY
        oServerWS:send(oDOMDoc:xml)
      CATCH oError
        cMsgRet:='Falha no envio do xML'
      END
    ENDIF

    IF Empt(cMsgRet)
      DO WHILE oServerWS:readyState <> 4
        HB_milliseconds(500)
      ENDDO

      cXMLResp := HB_ANSITOOEM(oServerWS:responseText)

      cMsgRet := pegaTag(cXMLResp, "InsereFichaAnaliseResult")
    ENDIF

Return (cMsgRet)

*******************************************************
Function pegaTag(cXMLcXML, cTag)
LOCAL c_Retorno, cTagInicio,cTagFim
   cTagInicio := "<"+cTag
   cTagFim := "</"+cTag+">"
   c_Retorno := SUBS( cXMLcXML, AT(cTagInicio,cXMLcXML)+LEN(cTagInicio)+1, AT(cTagFim,cXMLcXML)-(AT(cTagInicio,cXMLcXML)+LEN(cTagInicio)+1) )
RETURN(c_Retorno)
Obs: mensagem editada para declarar a variável cMsgRet:="" no início da função.

Chame a função, passando o arquivo xML para envio, por exemplo: cRetorno:=EnviaXML("c:\pasta\arquivo.xml")

Abraços,

Ajuda com webservice

Enviado: 21 Out 2015 09:28
por luiz antonio da silva
Bom dia !

Exatamente (rs), não sabia por onde iniciar.

Obrigado Toledo, vou iniciar os testes.

Abraço.
Luiz.

Ajuda com webservice

Enviado: 21 Out 2015 10:11
por JoséQuintas
Só comentário: Como todo exemplo de transmissão é assim, acaba parecendo que o DomDocument é obrigatório.

Código: Selecionar todos

 oDOMDoc = Win_oleCREATEOBJECT("MSXML2.DOMDocument.5.0") 
     oDOMDoc:async = .F. 
     oDOMDoc:validateOnParse  = .T. 
     oDOMDoc:resolveExternals := .F. 
     oDOMDoc:preserveWhiteSpace = .T. 
     oDOMDoc:LoadXML(cxMLSoap) 
     IF oDOMDoc:parseError:errorCode <> 0 
       cMsgRet:='Erro: xML nao carregado' 
     ENDIF 
...
         oServerWS:send(oDOMDoc:xml) 
...
Poderia ser transmitido assim:

Código: Selecionar todos

oServerWs:Send( cXmlSoap )
Se quiser tirar a prova, é só fazer a comparação antes de transmitir

Código: Selecionar todos

IF cXmlSoap == oDomDoc:Xml
   ? "Não fez diferença usar oDomDoc"
ENDIF

Ajuda com webservice

Enviado: 21 Out 2015 11:41
por luiz antonio da silva
Quais o requisitos Toledo ?

**o programa em questão vai usar adodb.ch (para pegar dados do banco local)


tá dando erro: winole/1007 (0x80072ee6): msxml5.dll

aparentemente tá normal aqui...alguma sugestão ?

Grato.
Luiz.

Ajuda com webservice

Enviado: 21 Out 2015 12:20
por Toledo
Amigo, incluir a LIB hbwin na compilação.

Abraços,

Ajuda com webservice

Enviado: 21 Out 2015 13:04
por JoséQuintas

Código: Selecionar todos

// oServerWs := Win_oleCREATEOBJECT("MSXML2.ServerXMLHTTP.5.0")
oServerWs := win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
Altere igual acima, senão vai precisar instalar o XML 5.0, que não faz parte do Windows.

Ajuda com webservice

Enviado: 21 Out 2015 14:46
por luiz antonio da silva
Obrigado Toledo e José Quintas.

Fiz as inclusões e alterações passadas, o erro agora mudou de msxml5.dll para msxml3.dll (rsrs...tá diminuindo...rs).

"ERROR WINOLE/1007 Erro de sistema: -2147012890 (0x80072EE6): msxml3.dll (DOS Error -2147352567).

reinstalei o XML 3 e nada, li em algum lugar que precisa de um ODBC (Driver para algo...mas o que ? a mens. não descreve o uso do ODBC)

Alguma Luz ?.

Grato.
Luiz.

Ajuda com webservice

Enviado: 21 Out 2015 15:00
por JoséQuintas
Mas olhou em qual linha acontece isso?
Se na comunicação ou no DomDocument?

Ajuda com webservice

Enviado: 21 Out 2015 15:02
por luiz antonio da silva
Outro detalhe....

Tem o pocketsoap para x64? (win 8.1) ?, procurei na net mas não encontrei ou não soube procurar.

Abraço.
Luiz.

Ajuda com webservice

Enviado: 21 Out 2015 15:28
por JoséQuintas
Aqui Windows 7, arquivos originais do Windows.
c:\Windows\System32\msxml3.dll
c:\Windows\System32\msxml3r.dll
c:\Windows\System32\msxml6.dll
c:\Windows\System32\msxml6r.dll

c:\Windows\SysWOW64\msxml3.dll
c:\Windows\SysWOW64\msxml3r.dll
c:\Windows\SysWOW64\msxml6.dll
c:\Windows\SysWOW64\msxml6r.dll
Se o Windows já tem isso, não imagino porque instalar o PocketSoap.

Ajuda com webservice

Enviado: 21 Out 2015 16:21
por luiz antonio da silva
Boa tarde novamente José Quintas !

o que colocar em cMsgRet se errorcode = 0 ?, sendo zero vai dar erro no if abaixo não é ?

IF oDOMDoc:parseError:errorCode <> 0
cMsgRet:='Erro: xML nao carregado'
ENDIF

IF Empt(cMsgRet)
TRY
oServerWS:send(oDOMDoc:xml)
CATCH oError
cMsgRet:='Falha no envio do xML'
END
ENDIF

Ajuda com webservice

Enviado: 21 Out 2015 16:26
por JoséQuintas
Compilar usando -w3 -es2 já avisaria isso... rs... só comentário...
Pode fazer isso no início.

Código: Selecionar todos

LOCAL cXmlResp := ""

Ajuda com webservice

Enviado: 21 Out 2015 16:45
por luiz antonio da silva
blz...rsrs

agora só tá dando erro 1005 no exported variable ASYNC, que está definida com valor .F.

Abraço.
Luiz.

Ajuda com webservice

Enviado: 21 Out 2015 16:46
por Toledo
luiz antonio da silva escreveu:sendo zero vai dar erro no if abaixo não é ?
Amigo, quando copiei esta função de um dos meus programas, andei retirando algumas linhas de código que era específico do meu programa, então acabei retirando a linha onde era declarado a variável cMsgRet:="". Para corrigir, basta no início da função declarar a variável:

Código: Selecionar todos

Local cSOAPAction:="http://tempuri.org/InsereFichaAnalise", cMsgRet:=""
Abraços,