Consumir Webservice ( SOAP )

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

Moderador: Moderadores

Avatar do usuário
Alexandre Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 376
Registrado em: 26 Mar 2007 00:16
Localização: Itapema - SC

Consumir Webservice ( SOAP )

Mensagem por Alexandre Silva »

Entao pessoal..
após varias tentativas... inclusive com apoio do José Quintas.. nao obtivemos sucesso...
segue em anexo um exemplo e delphi.. que já testei e funciona...
o xml que se deve mandar é de um cte ok

Pode ser que alguem veja algo nao vimos no exemplo em harbour...
pois no harbour temos sempre o mesmo retorno:
<DESCCOMPLETA>Usuario nao informado</DESCCOMPLETA>

Estou disposto a pagar para quem resolver o problema usando harbour...

Obrigado
Anexos
meux.xml
(7.96 KiB) Baixado 468 vezes
SOAP.PRG
(2.63 KiB) Baixado 356 vezes
exemploConsumo_delphi.rar
(89.15 KiB) Baixado 428 vezes
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Consumir Webservice ( SOAP )

Mensagem por Itamar M. Lins Jr. »

Tem que usar as ferramentas certas.
Você não está verificando se o XML é válido antes de enviar.
No Harbour 3.4, eu acrescentei umas linhas p/ validar se seu XML está ok antes de enviar, e retorna "XML com problema".
Não vai funcionar porque vc está enviando um XML já com erro.
#include "hbxml.ch"
#include "hbmxml.ch"

function main()
LOCAL cXml, cSoapAction, cWebservice, cOperation, cRetorno
cls
cWebservice := "http://homologacao.averba.com.br/webserver/index.soap"
cSoapAction := "urn:ATMWebSvr#averbaCTe20"
cOperation := "averbaCTe20Request"
*-
cxlido:=HB_Memoread('meux.xml')
cXml := ""
*cXml += [<args>]
cXml += XmlTag( "usuario", "TESTES" )
cXml += XmlTag( "senha", "BASE" )
cXml += XmlTag( "codatm", "11340073" )
*--
cxml +='<xmlCTe><![CDATA['
cxml +=cxlido
cxml +=']]>'
cXml +='</xmlCTe>'


*cXml += [</args>]
cXml := SoapEnvelope( cXml, cOperation ) //

oXML := TXMLDocument():New( cXml, HBXML_STYLE_NOESCAPE )
IF oXML:nError != HBXML_ERROR_NONE
alert( "xml com problema " + Str( oXML:nError ) )
RETURN
ENDIF


*--
cRetorno := MicrosoftXmlSoapPost( cXml, cSoapAction, cWebservice )
*--
HB_MemoWrit('retorno.xml',cRetorno)
? cRetorno
RETURN
C:\teste>hbmk2 SOAP.prg hbwin.hbc hbct.hbc hbmxml.hbc xhb.hbc
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Alexandre Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 376
Registrado em: 26 Mar 2007 00:16
Localização: Itapema - SC

Consumir Webservice ( SOAP )

Mensagem por Alexandre Silva »

OPA !! já é um começo.. Erro xml 11
o que seria ? nao tenho a tabela desses erros...
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Consumir Webservice ( SOAP )

Mensagem por Itamar M. Lins Jr. »

Pois é, tem versões dessa string ai.
To use SOAP 1.1 encoding, use the value http://schemas.xmlsoap.org/soap/encoding/
To use SOAP 1.2 encoding, use the value http://www.w3.org/2001/12/soap-encoding
http://www.tutorialspoint.com/soap/soap_encoding.htm

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Consumir Webservice ( SOAP )

Mensagem por Itamar M. Lins Jr. »

Aê gafanhoto!
Seu XML está muito diferente do exemplo dele!!!
O dele está assim:

Código: Selecionar todos

Como é para ser:
         <usuario xsi:type="xsd:string">TESTES</usuario>
         <senha xsi:type="xsd:string">BASE</senha>
         <codatm xsi:type="xsd:string">11340073</codatm>
         <xmlCTe xsi:type="xsd:string">

Como vc fez:
<usuario>TESTES</usuario><senha>BASE</senha><codatm>11340073</codatm><xmlCTe>
Ai só Jesus na CAUSA!!!!
Formata seu XML p/ ficar igual ao exemplo dele com quebra de linha!!

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Alexandre Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 376
Registrado em: 26 Mar 2007 00:16
Localização: Itapema - SC

Consumir Webservice ( SOAP )

Mensagem por Alexandre Silva »

Estamos evoluindo..... agora com o CRLF
Fico na duvida sobre o envelope... todos esses comandos foi o Quintas que montou...
Por exemplo aqui: xmlns:urn="urn:xmethods-delayed-quotes", nao deveria ter um comando ?



<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:xmethods-delayed-quotes">
<soapenv:Header/>
<soapenv:Body>
<urn:averbaCTe20Request xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:ATMWebSvr" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:ATMWebSvr">
<service name="ATMWebSvr">
<port name="ATMWebSvrPort" binding="tns:ATMWebSvrBinding">
<soap:address location="http://homologacao.averba.com.br/webserver/index.soap"/>
</port>
</service>
<usuario xsi:type="xsd:string">TESTES</usuario>
<senha xsi:type="xsd:string">BASE</senha>
<codatm xsi:type="xsd:string">11340073</codatm>
<xmlCTe xsi:type="xsd:string">
<![CDATA[


PS:
Continua retornando:
<DESCCOMPLETA>Usuario nao informado</DESCCOMPLETA>


http://homologacao.averba.com.br/webse ... ex.soap#


Name: averbaCTe20
Binding: ATMWebSvrBinding
Endpoint: http://homologacao.averba.com.br/webserver/index.soap
SoapAction: urn:ATMWebSvr#averbaCTe20
Style: rpc
Input:
use: encoded
namespace: urn:ATMWebSvr
encodingStyle: http://schemas.xmlsoap.org/soap/encoding/
message: averbaCTe20Request
parts:
usuario: xsd:string
senha: xsd:string
codatm: xsd:string
xmlCTe: xsd:string
Output:
use: encoded
namespace: urn:ATMWebSvr
encodingStyle: http://schemas.xmlsoap.org/soap/encoding/
message: averbaCTe20Response
parts:
return: xsd:string
Namespace: urn:ATMWebSvr
Transport: http://schemas.xmlsoap.org/soap/http
Documentation: Interface de averbação eletrônica AT&M para CTe. Versão do WebServer 2

Anexos
SOAP.PRG
(3.7 KiB) Baixado 258 vezes
vai.xml
(9.05 KiB) Baixado 333 vezes
meux.xml
(7.95 KiB) Baixado 359 vezes
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Consumir Webservice ( SOAP )

Mensagem por Toledo »

Alexandre, faz um teste com este SOAP.PRG em anexo. Para compilar veja início do SOAP.PRG e use Harbour 3.2 ou superior.

Abraços,
Anexos
soap.zip
(21.65 KiB) Baixado 649 vezes
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Alexandre Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 376
Registrado em: 26 Mar 2007 00:16
Localização: Itapema - SC

Consumir Webservice ( SOAP )

Mensagem por Alexandre Silva »

Muito obrigado ficou certo
:))
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
informaisvrb
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 09 Jun 2013 15:00
Localização: VISCONDE DO RIO BRANCO

Consumir Webservice ( SOAP )

Mensagem por informaisvrb »

amigo Alexandre Silva, estou precisando de uma ajuda sua com algo parecido com o que voce fez.

Tenho que fazer quase ou o mesmo que voce fez para a seguradora

http://generali.averbweb.net.br/documentacao#arquivoxml


Será que pode me ajudar.

me adiciona o skype, ou me manda um e-mail com seu contato (se puder é claro)
Nota de Moderação:
por Toledo: Leia as Regras do fórum:

11 - Não é permitido postar o e-mail pessoal com o objetivo de receber ou oferecer qualquer auxílio que poderia ser feito pelo Fórum. O Fórum foi criado para intermediar a comunicação entre os participantes, não servir de mural de recados.
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Consumir Webservice ( SOAP )

Mensagem por gilbertosilverio »

Bom dia Amigos,

Estou tentado, baseado neste exemplo, me comunicar com um servidor web, da BIONEXO, mais como informações do manual dele são muito genericas, não estou conseguindo.

Como não conheço nada deste tipo de comunicação, estou mais perdido que cachorro em dia de mudança... rsrsrs

Se alguem, ja fez este tipo de integração, com a Bionexo, e puder me ajudar.

Pela rotina passada pelo TOLEDO, imagino que seja possível, fazer esta comunicação.

No Manual deles, somente e informado:

Métodos e Retornos
Abaixo descrição dos métodos e retornos disponíveis para a comunicação com a plataforma Bionexo.

- String post (String user, String password, String operation, String parameters, xml)
Método genérico para todas as operações de envio (POST). Os parâmetros devem ser passados
no string ou um objeto DataHandler. Seu retorno é feito por meio de um bloco padrão que
varia de acordo a operação e parâmetro(s) passado(s) que está(ão) comentado(s) abaixo.
Parâmetros:
String post (‘String user’, ‘String password’, ‘String operation’, ‘String parameters’, xml)
Exemplo:
post (‘teste’, ’1234’, ’WHS’, ‘LAYOUT=WH’, <XML file/>)

- String request (String user, String password, String operation, String parameters)
Método genérico para todas as operações de busca de informações(GET). Os parâmetros
devem ser enviados no formato padrão HTTP ou HTTPS. Seu retorno é feito por meio de um
bloco padrão que varia de acordo a operação e parâmetros passados que estão comentados
abaixo.

Como montar o método:
String request (String User, String Password, String operation, String parameters)
Exemplo:
String request (teste,1234,WHS, LAYOUT=WH;TOKEN=1234)

Agradeço, qualquer ajuda ou dica.

Gilberto Silverio.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Consumir Webservice ( SOAP )

Mensagem por JoséQuintas »

Agora que vi, o webservice do MA é a única UF que tem parâmetros parecidos com o primeiro post.
Esse negócio de binding e port.

https://sistemas.sefaz.ma.gov.br/wscada ... stro2?wsdl

Precisa certificado pra poder abrir o endereço, mas mostra o texto abaixo.
Depois vou tentar aplicar a mesma solução daqui.
<?xml version='1.0' encoding='UTF-8'?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.8 svn-revision#13980. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.8 svn-revision#13980. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/ ... ty-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://www.portalfiscal.inf.br/nfe/wsdl ... aCadastro2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://www.portalfiscal.inf.br/nfe/wsdl ... aCadastro2" name="CadConsultaCadastro2">
<types>
<xsd:schema>
<xsd:import namespace="http://www.portalfiscal.inf.br/nfe/wsdl ... aCadastro2" schemaLocation="https://sistemas.sefaz.ma.gov.br:443/ws ... o2?xsd=1"/>
</xsd:schema>
</types>
<message name="consultaCadastro2">
<part name="nfeDadosMsg" element="tns:nfeDadosMsg"/>
<part name="nfeCabecMsg" element="tns:nfeCabecMsg"/>
</message>
<message name="consultaCadastro2Response">
<part name="consultaCadastro2Result" element="tns:consultaCadastro2Result"/>
<part name="nfeCabecMsg" element="tns:nfeCabecMsg"/>
</message>
<portType name="CadConsultaCadastro2Soap">
<operation name="consultaCadastro2" parameterOrder="nfeDadosMsg nfeCabecMsg">
<input wsam:Action="http://www.portalfiscal.inf.br/nfe/wsdl ... aCadastro2" message="tns:consultaCadastro2"/>
<output wsam:Action="http://www.portalfiscal.inf.br/nfe/wsdl ... o2Response" message="tns:consultaCadastro2Response"/>
</operation>
</portType>
<binding name="CadConsultaCadastro2Soap12Binding" type="tns:CadConsultaCadastro2Soap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="consultaCadastro2">
<soap12:operation soapAction="http://www.portalfiscal.inf.br/nfe/wsdl ... adastro2"/>
<input>
<soap12:body use="literal" parts="nfeDadosMsg"/>
<soap12:header message="tns:consultaCadastro2" part="nfeCabecMsg" use="literal"/>
</input>
<output>
<soap12:body use="literal" parts="consultaCadastro2Result"/>
<soap12:header message="tns:consultaCadastro2Response" part="nfeCabecMsg" use="literal"/>
</output>
</operation>
</binding>
<service name="CadConsultaCadastro2">
<port name="CadConsultaCadastro2Soap12" binding="tns:CadConsultaCadastro2Soap12Binding">
<soap12:address location="https://sistemas.sefaz.ma.gov.br:443/ws ... adastro2"/>
</port>
</service>
</definitions>
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/
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Consumir Webservice ( SOAP )

Mensagem por gilbertosilverio »

Ola Jose Quintas,

Obrigado pela sua resposta.

Entrei em contato como suporte técnico da Bionexo, e eles me passaram este modelo de comunicação via SOAP, mais não tenho nem ideia de por onde começar, veja se voce consegue me ajudar ha como devo proceder, pois não consigo enxergar a logica de como funciona esta comunicação via webserver.

Código: Selecionar todos

<con:definitionCache type="TEXT" rootPart="https://www.bionexo.com.br/ws2/BionexoBean?wsdl" xmlns:con="http://eviware.com/soapui/config"><con:part><con:url>https://www.bionexo.com.br/ws2/BionexoBean?wsdl</con:url><con:content><![CDATA[<definitions name="BionexoBeanService" targetNamespace="http://webservice.bionexo.com/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservice.bionexo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <types/>
  <message name="BionexoInterface_requestResponse">
    <part name="return" type="xsd:string"/>
  </message>
  <message name="BionexoInterface_request">
    <part name="login" type="xsd:string"/>
    <part name="password" type="xsd:string"/>
    <part name="operation" type="xsd:string"/>
    <part name="parameters" type="xsd:string"/>
  </message>
  <message name="BionexoInterface_post">
    <part name="login" type="xsd:string"/>
    <part name="password" type="xsd:string"/>
    <part name="operation" type="xsd:string"/>
    <part name="parameters" type="xsd:string"/>
    <part name="xml" type="xsd:string"/>
  </message>
  <message name="BionexoInterface_postResponse">
    <part name="return" type="xsd:string"/>
  </message>
  <portType name="BionexoInterface">
    <operation name="post" parameterOrder="login password operation parameters xml">
      <input message="tns:BionexoInterface_post"/>
      <output message="tns:BionexoInterface_postResponse"/>
    </operation>
    <operation name="request" parameterOrder="login password operation parameters">
      <input message="tns:BionexoInterface_request"/>
      <output message="tns:BionexoInterface_requestResponse"/>
    </operation>
  </portType>
  <binding name="BionexoInterfaceBinding" type="tns:BionexoInterface">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="post">
      <soap:operation soapAction=""/>
      <input>
        <soap:body namespace="http://webservice.bionexo.com/" use="literal"/>
      </input>
      <output>
        <soap:body namespace="http://webservice.bionexo.com/" use="literal"/>
      </output>
    </operation>
    <operation name="request">
      <soap:operation soapAction=""/>
      <input>
        <soap:body namespace="http://webservice.bionexo.com/" use="literal"/>
      </input>
      <output>
        <soap:body namespace="http://webservice.bionexo.com/" use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="BionexoBeanService">
    <port binding="tns:BionexoInterfaceBinding" name="BionexoPort">
      <soap:address location="http://app-br-ws-jboss.bionexo.com:8180/bionexo-wsEAR-bionexo-wsn/BionexoBean"/>
    </port>
  </service>
</definitions>]]></con:content><con:type>http://schemas.xmlsoap.org/wsdl/</con:type></con:part></con:definitionCache>

<con:soapui-project activeEnvironment="Default" name="WS_Bionexo" soapui-version="5.2.0" abortOnError="false" runType="SEQUENTIAL" resourceRoot="" id="6ea2ce5b-bcc8-4323-8e4b-3d252956fbca">
 <con:settings/>
<con:interface xsi:type="con:WsdlInterface" wsaVersion="NONE" name="BionexoInterfaceBinding" type="wsdl" bindingName="{http://webservice.bionexo.com/}BionexoInterfaceBinding" soapVersion="1_1" anonymous="optional" definition="https://www.bionexo.com.br/ws2/BionexoBean?wsdl" id="547aba4c-2faf-4e3e-b7c5-2056f3169672">
 <con:settings/>
<con:definitionCache type="TEXT" rootPart="https://www.bionexo.com.br/ws2/BionexoBean?wsdl">
<con:part>
 <con:url>https://www.bionexo.com.br/ws2/BionexoBean?wsdl</con:url>
 <con:content><definitions name="BionexoBeanService" targetNamespace="http://webservice.bionexo.com/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservice.bionexo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <types/> <message name="BionexoInterface_requestResponse"> <part name="return" type="xsd:string"/> </message> <message name="BionexoInterface_request"> <part name="login" type="xsd:string"/> <part name="password" type="xsd:string"/> <part name="operation" type="xsd:string"/> <part name="parameters" type="xsd:string"/> </message> <message name="BionexoInterface_post"> <part name="login" type="xsd:string"/> <part name="password" type="xsd:string"/> <part name="operation" type="xsd:string"/> <part name="parameters" type="xsd:string"/> <part name="xml" type="xsd:string"/> </message> <message name="BionexoInterface_postResponse"> <part name="return" type="xsd:string"/> </message> <portType name="BionexoInterface"> <operation name="post" parameterOrder="login password operation parameters xml"> <input message="tns:BionexoInterface_post"/> <output message="tns:BionexoInterface_postResponse"/> </operation> <operation name="request" parameterOrder="login password operation parameters"> <input message="tns:BionexoInterface_request"/> <output message="tns:BionexoInterface_requestResponse"/> </operation> </portType> <binding name="BionexoInterfaceBinding" type="tns:BionexoInterface"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="post"> <soap:operation soapAction=""/> <input> <soap:body namespace="http://webservice.bionexo.com/" use="literal"/> </input> <output> <soap:body namespace="http://webservice.bionexo.com/" use="literal"/> </output> </operation> <operation name="request"> <soap:operation soapAction=""/> <input> <soap:body namespace="http://webservice.bionexo.com/" use="literal"/> </input> <output> <soap:body namespace="http://webservice.bionexo.com/" use="literal"/> </output> </operation> </binding> <service name="BionexoBeanService"> <port binding="tns:BionexoInterfaceBinding" name="BionexoPort"> <soap:address location="http://app-br-ws-jboss.bionexo.com:8180/bionexo-wsEAR-bionexo-wsn/BionexoBean"/> </port> </service> </definitions></con:content>
 <con:type>http://schemas.xmlsoap.org/wsdl/</con:type>
 </con:part>
 </con:definitionCache>
<con:endpoints>
 <con:endpoint>http://sandbox.bionexo.com.br/ws2/BionexoBean</con:endpoint>
 </con:endpoints>
<con:operation isOneWay="false" action="" name="post" bindingOperationName="post" type="Request-Response" inputName="" receivesAttachments="false" sendsAttachments="false" anonymous="optional" id="1bf7de46-8a8e-4d4b-b6b3-ab27a46d85b2">
 <con:settings/>
<con:call id="5201eefd-4f4f-4dea-9522-0b8a94879a8d" name="WHS - Upload Resposta">
<con:settings>
 <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting>
 </con:settings>
 <con:encoding>UTF-8</con:encoding>
 <con:endpoint>http://sandbox.bionexo.com.br/ws2/BionexoBean</con:endpoint>
 <con:request><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.bionexo.com/"> <soapenv:Header/> <soapenv:Body> <web:post> <login></login> <password></password> <operation>WHS</operation> <parameters>LAYOUT=WH</parameters> <xml> <Resposta> <Cabecalho> <Id_Pdc>33200164</Id_Pdc> <CNPJ_Hospital>04.069.709/0001-02</CNPJ_Hospital> <Faturamento_Minimo>750</Faturamento_Minimo> <Prazo_Entrega>3</Prazo_Entrega> <Validade_Proposta>31/12/2016</Validade_Proposta> <Id_Forma_Pagamento>4</Id_Forma_Pagamento> <Frete>CIF</Frete> <Observacoes/> </Cabecalho> <Itens_Pdc> <Item_Pdc> <Sequencia>1</Sequencia> <Id_Artigo>44010010</Id_Artigo> <Codigo_Produto>01000146</Codigo_Produto> <Preco_Unitario>1.85</Preco_Unitario> <Fabricante>CREMER</Fabricante> <Embalagem>UNIDADE</Embalagem> <Quantidade_Embalagem>1</Quantidade_Embalagem> <Comentario/> <Campo_Extra> <Nome>Codigo_Produto_Fornecedor</Nome> <Valor>1515</Valor> </Campo_Extra> </Item_Pdc> </Itens_Pdc> </Resposta> </xml> </web:post> </soapenv:Body> </soapenv:Envelope></con:request>
<con:credentials>
 <con:authType>No Authorization</con:authType>
 </con:credentials>
 <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
 <con:jmsPropertyConfig/>
 <con:wsaConfig mustUnderstand="NONE" version="200508" action="http://webservice.bionexo.com/BionexoInterface/postRequest"/>
 <con:wsrmConfig version="1.2"/>
 </con:call>
<con:call id="919e5bba-c065-4b05-a26b-84c3bbc00317" name="WHU - Alterar Cancelar Resposta">
<con:settings>
 <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting>
 </con:settings>
 <con:encoding>UTF-8</con:encoding>
 <con:endpoint>http://sandbox.bionexo.com.br/ws2/BionexoBean</con:endpoint>
 <con:request><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.bionexo.com/"> <soapenv:Header/> <soapenv:Body> <web:post> <login></login> <password></password> <operation>WHU</operation> <parameters>LAYOUT=WH</parameters> <xml> <Resposta> <Cabecalho> <Id_Pdc>33200164</Id_Pdc> <CNPJ_Hospital>04.069.709/0001-02</CNPJ_Hospital> <Faturamento_Minimo>750</Faturamento_Minimo> <Prazo_Entrega>3</Prazo_Entrega> <Validade_Proposta>31/12/2016</Validade_Proposta> <Id_Forma_Pagamento>4</Id_Forma_Pagamento> <Frete>CIF</Frete> <Observacoes/> </Cabecalho> <Itens_Pdc> <Item_Pdc> <Sequencia>1</Sequencia> <Id_Artigo>44010010</Id_Artigo> <Codigo_Produto>01000146</Codigo_Produto> <Preco_Unitario>1.85</Preco_Unitario> <Fabricante>CREMER</Fabricante> <Embalagem>UNIDADE</Embalagem> <Quantidade_Embalagem>1</Quantidade_Embalagem> <Comentario/> <Campo_Extra> <Nome>Codigo_Produto_Fornecedor</Nome> <Valor>1515</Valor> </Campo_Extra> </Item_Pdc> </Itens_Pdc> </Resposta> </xml> </web:post> </soapenv:Body> </soapenv:Envelope></con:request>
<con:credentials>
 <con:authType>No Authorization</con:authType>
 </con:credentials>
 <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
 <con:jmsPropertyConfig/>
 <con:wsaConfig mustUnderstand="NONE" version="200508" action="http://webservice.bionexo.com/BionexoInterface/postRequest"/>
 <con:wsrmConfig version="1.2"/>
 </con:call>
 </con:operation>
<con:operation isOneWay="false" action="" name="request" bindingOperationName="request" type="Request-Response" inputName="" receivesAttachments="false" sendsAttachments="false" anonymous="optional" id="e9429ce9-f80e-477b-b8cc-faa5a086e98a">
 <con:settings/>
<con:call name="WJG - Download Itens Confirmado" id="30596d1e-33f6-4dc3-b95c-d20986d5f15e">
<con:settings>
 <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting>
 </con:settings>
 <con:encoding>UTF-8</con:encoding>
 <con:endpoint>http://sandbox.bionexo.com.br/ws2/BionexoBean</con:endpoint>
 <con:request><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.bionexo.com/"> <soapenv:Header/> <soapenv:Body> <web:request> <login></login> <password></password> <operation>WJG</operation> <parameters>TOKEN=1</parameters> </web:request> </soapenv:Body> </soapenv:Envelope></con:request>
<con:credentials>
 <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
 <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
 <con:authType>Global HTTP Settings</con:authType>
 </con:credentials>
 <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
 <con:jmsPropertyConfig/>
 <con:wsaConfig mustUnderstand="NONE" version="200508" action="http://webservice.bionexo.com/BionexoInterface/requestRequest"/>
 <con:wsrmConfig version="1.2"/>
 </con:call>
<con:call name="WGA - Download Prorrogados" id="f8a7bbef-4577-4eb1-a8f2-8264f5b774b6">
<con:settings>
 <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting>
 </con:settings>
 <con:encoding>UTF-8</con:encoding>
 <con:endpoint>http://sandbox.bionexo.com.br/ws2/BionexoBean</con:endpoint>
 <con:request><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.bionexo.com/"> <soapenv:Header/> <soapenv:Body> <web:request> <login></login> <password></password> <operation>WGA</operation> <parameters> DT_BEGIN=01/12/2015 16:40:00:00;DT_END=07/12/2015 16:50:59</parameters> </web:request> </soapenv:Body> </soapenv:Envelope></con:request>
<con:credentials>
 <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
 <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
 <con:authType>Global HTTP Settings</con:authType>
 </con:credentials>
 <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
 <con:jmsPropertyConfig/>
 <con:wsaConfig mustUnderstand="NONE" version="200508" action="http://webservice.bionexo.com/BionexoInterface/requestRequest"/>
 <con:wsrmConfig version="1.2"/>
 </con:call>
<con:call name="WKN - Status Itens" id="e1b8d1df-373f-46ba-9c49-aee198776ffc">
<con:settings>
 <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting>
 </con:settings>
 <con:encoding>UTF-8</con:encoding>
 <con:endpoint>http://sandbox.bionexo.com.br/ws2/BionexoBean</con:endpoint>
 <con:request><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.bionexo.com/"> <soapenv:Header/> <soapenv:Body> <web:request> <login></login> <password></password> <operation>WKN</operation> <parameters>ID=22995452</parameters> </web:request> </soapenv:Body> </soapenv:Envelope></con:request>
<con:credentials>
 <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
 <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
 <con:authType>Global HTTP Settings</con:authType>
 </con:credentials>
 <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
 <con:jmsPropertyConfig/>
 <con:wsaConfig mustUnderstand="NONE" version="200508" action="http://webservice.bionexo.com/BionexoInterface/requestRequest"/>
 <con:wsrmConfig version="1.2"/>
 </con:call>
<con:call name="WGG - Download PDC Aberto" id="e0fe6c87-7fec-4188-897b-5d8b4d59fb28">
<con:settings>
 <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting>
 </con:settings>
 <con:encoding>UTF-8</con:encoding>
 <con:endpoint>http://sandbox.bionexo.com.br/ws2/BionexoBean</con:endpoint>
 <con:request><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.bionexo.com/"> <soapenv:Header/> <soapenv:Body> <web:request> <login></login> <password></password> <operation>WGG</operation> <parameters>TOKEN=33200164</parameters> </web:request> </soapenv:Body> </soapenv:Envelope></con:request>
<con:credentials>
 <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
 <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
 <con:authType>Global HTTP Settings</con:authType>
 </con:credentials>
 <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
 <con:jmsPropertyConfig/>
 <con:wsaConfig mustUnderstand="NONE" version="200508" action="http://webservice.bionexo.com/BionexoInterface/requestRequest"/>
 <con:wsrmConfig version="1.2"/>
 </con:call>
<con:call name="WMG - Download Dados Cadastrais" id="ce2c7b93-099f-49c6-b070-cf55974bb4e9">
<con:settings>
 <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting>
 </con:settings>
 <con:encoding>UTF-8</con:encoding>
 <con:endpoint>http://sandbox.bionexo.com.br/ws2/BionexoBean</con:endpoint>
 <con:request><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.bionexo.com/"> <soapenv:Header/> <soapenv:Body> <web:request> <login></login> <password></password> <operation>WMG</operation> <parameters>CNPJ=11.111.111/0001-11</parameters> </web:request> </soapenv:Body> </soapenv:Envelope></con:request>
<con:credentials>
 <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
 <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
 <con:authType>Global HTTP Settings</con:authType>
 </con:credentials>
 <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
 <con:jmsPropertyConfig/>
 <con:wsaConfig mustUnderstand="NONE" version="200508" action="http://webservice.bionexo.com/BionexoInterface/requestRequest"/>
 <con:wsrmConfig version="1.2"/>
 </con:call>
 </con:operation>
 </con:interface>
<con:properties>
<con:property>
 <con:name>teste</con:name>
 <con:value>teste</con:value>
 </con:property>
<con:property>
 <con:name>WASE</con:name>
 <con:value>WASE</con:value>
 </con:property>
<con:property>
 <con:name>XML</con:name>
 <con:value><Pedido layout="WA"> <Cabecalho> <Requisicao>07052013-1214</Requisicao> <Titulo_Pdc>Teste pre pedido</Titulo_Pdc> <Id_Forma_Pagamento>1</Id_Forma_Pagamento> <Data_Vencimento>23/05/2013</Data_Vencimento> <Hora_Vencimento>23:59</Hora_Vencimento> <Moeda>Reais</Moeda> <Observacao/> <Campo_Extra> <Nome>SETOR</Nome> <Valor>CENTRAL DE ABAST FARMACEUTICO</Valor> </Campo_Extra> </Cabecalho> <Itens_Requisicao> <Item_Requisicao> <Codigo_Produto>45460</Codigo_Produto> <Descricao_Produto>Agua Oxigenada</Descricao_Produto> <Quantidade>1</Quantidade> </Item_Requisicao> </Itens_Requisicao> </Pedido></con:value>
 </con:property>
<con:property>
 <con:name>TOKEN</con:name>
 <con:value>15551069</con:value>
 </con:property>
 </con:properties>
 <con:wssContainer/>
 <con:oAuth2ProfileContainer/>
 <con:sensitiveInformation/>
 </con:soapui-project>
Caso exista algum tutorial BASICO, de como funciona esta comunicação via SOAP/WEBSERVER, para que eu posa entender como funciona, por favor me passe.
Grato.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Consumir Webservice ( SOAP )

Mensagem por JoséQuintas »

A lógica é simples, os detalhes é que complicam.
É enviar um XML e receber outro como resposta.

Imagine um programa em Harbour:

Código: Selecionar todos

PARAMETERS cXmlEntrada
   DO CASE
   CASE TemSoapAction( cXmlEntrada, "umacoisa" ) ;      cXmlSaida := SoapActionUmaCoisa(Parte(cXmlEntrada))
   CASE TemSoapAction( cXmlEntrada, "outracoisa" ) ;    cXmlSaida := SoapActionOutraCoisa(Parte(cXmlEntrada))
   OTHERWISE   ; cXmlSaida := "SoapAction inexistente"
   ENDCASE
   RETURN cXmlSaida
O Webservice é algo assim.
Tem a parte padrão de se comunicar com o webservice, e tem os detalhes adicionais que dependem do que o programador colocou.

Com certeza a forma de indicar "variáveis"/valores é padrão, mas os nomes e conteúdo não.

Agora vamos ao seu arquivo:
à primeira vista, te passaram exatamente o XML que o seu aplicativo deve gerar pra transmissão.

Um começo seria trocar os valores dele pelos seus valores, ou até tentar com o que veio

Por exemplo aqui: código do produto, descrição e quantidade
<Codigo_Produto>45460</Codigo_Produto> <Descricao_Produto>Agua Oxigenada</Descricao_Produto> <Quantidade>1</Quantidade>

Não sou expert no assunto. Só me acertei com os webservices de NFE, CTE, MDFE porque os manuais são bem completos, e todos seguem o mesmo esquema.
No caso acima do Maranhão, é o único diferente de todos os outros, ainda não resolvi.

Então pode dividir seu problema em duas partes:

1. Comunicar com o webservice

É basicamente entregar o XML e receber resposta.
Existe um formato válido para o chamado "envelope de soap".
<envelope>este aqui é um envelope<conteudo>aqui o conteúdo</conteudo></envelope>
o envelope precisa estar correto pra ser aceito

Dependendo do webservice, não há nenhum tipo de resposta enquanto no mínimo o envelope não estiver correto

2. O conteúdo ser aceito

o conteúdo são os valores propriamente ditos, que ficam embutidos no xml principal.
Comparando com o webservice do governo, seria uma nota fiscal preenchida corretamente.
No caso da NFE, retornam mensagens dizendo qual informação está preenchida errada.

Acho que a soapaction dá uma idéia do endereço de comunicação, é o ponto de partida:
http://webservice.bionexo.com/BionexoIn ... ostRequest

E o ponto de partida do XML é esse XML que recebeu, pode tentar transmití-lo pra ver a resposta.

Mas é possível que tenha alguma senha ou identificação específica para sua empresa.

A partir daí é com quem tenha mais conhecimento do que eu.

A intenção foi só dar uma idéia do que se trata.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Consumir Webservice ( SOAP )

Mensagem por JoséQuintas »

Depois de tanto tempo do primeiro post, agora vou ter que fazer essa mesma comunicação da ATM, que iniciou o post.
O manual mostra detalhes do retorno, mas NENHUM detalhe do envio.

É engraçado como as seguradoras são umas bost. nisso.
Orientaram que o usuário deveria ficar consultando no programa deles pra ver o número da averbação, e digitar no manifesto.
Só quando perguntei do webservice, é que falaram dele.

Resumindo: os bost. da seguradora criaram um programa pra fazer tudo diferente, tá assim faz tempo, CULPA DELES, e agora pedem urgência, porque a empresa pode ser fiscalizada e multada, por não estar como a lei manda. Bem estilo Brasil....

Agora começar isso, que virou pra ontem....
Se alguém tiver alguma informação que ajude... é exatamente o averba da ATM, que apareceu no começo do tópico...
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Consumir Webservice ( SOAP )

Mensagem por JoséQuintas »

Por enquanto peguei o PRG do Itamar, ajustei pro meu jeito, e testei com o endereço oficial, mas... vou precisar aguardar usuário/senha e ambiente de teste pra ir em frente.

Código: Selecionar todos


FUNCTION main()

   LOCAL cXml, cSoapAction, cWebservice, cOperation, cRetorno

   SetMode(40,100)
   CLS
   cWebservice := "webservice.averba.com.br/20"
   cSoapAction := "urn:ATMWebSvr#averbaCTe20"
   cOperation  := "averbaCTe20"
   cXmlDoc     := HB_Memoread( "meux.xml" )
   cXmlEnvio   := [         <usuario xsi:type="xsd:string">TESTES</usuario>] + hb_eol()
   cXmlEnvio   += [         <senha xsi:type="xsd:string">BASE</senha>] + hb_eol()
   cXmlEnvio   += [         <codatm xsi:type="xsd:string">11340073</codatm>] + hb_eol()
   cXmlEnvio   += [         <xmlCTe xsi:type="xsd:string"><!]
   cXmlEnvio   += "[" + [CDATA] + "[" + cXmlDoc + "]]" + [></xmlCTe>] + hb_eol()
   cXmlSoap    := SoapEnvelope( cXmlEnvio, cOperation )
   cXmlRetorno := MicrosoftXmlSoapPost( cXmlSoap, cSoapAction, cWebservice )
   ? cXmlRetorno

   RETURN

FUNCTION MicrosoftXmlSoapPost( cXmlSoap, cSoapAction, cWebService )

   LOCAL oServer, oDOMDoc, nCont, cRetorno := "*ERRO*", cXmlRetorno := ""

   oServer := win_OleCreateObject( "MSXML2.ServerXMLHTTP")
   oServer:Open( "POST", cWebService, .F. )
   oServer:SetRequestHeader( "SOAPAction", cSoapAction )
   oServer:SetRequestHeader( "Content-Type", "text/xml; charset=utf-8" )
   oServer:send( cXmlSoap )
   oServer:WaitForResponse( 1000 )
   cRetorno := oServer:responseText

   IF ValType( cRetorno ) == "C"
      cXmlRetorno := cRetorno
   ELSEIF cRetorno == NIL
      cXmlRetorno := "*ERRO*"
   ELSE
      cXmlRetorno := ""
      FOR nCont = 1 TO Len( cRetorno )
         cXmlRetorno += Chr( cRetorno[ nCont ] )
      NEXT
   ENDIF

   RETURN cXmlRetorno

FUNCTION SoapEnvelope( cXml, cOperation )

   LOCAL cXmlEnvelope

   cXmlEnvelope := [<?xml version="1.0" encoding="utf-8"?>] + hb_Eol()
   cXmlEnvelope += [<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ]
   cXmlEnvelope += [xmlns:xsd="http://www.w3.org/2001/XMLSchema" ]
   cXmlEnvelope += [ xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ]
   cXmlEnvelope += [xmlns:urn="urn:ATMWebSvr">] + hb_eol()
   cXmlEnvelope += [   <soapenv:Header/>] + hb_Eol()
   cXmlEnvelope += [   <soapenv:Body>] + hb_Eol()
   cXmlEnvelope += [      <urn:] + cOperation
   cXmlEnvelope += [ soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">]  + hb_Eol()
   cXmlEnvelope += cXml
   cXmlEnvelope += [      </urn:] + cOperation + [>] + hb_eol()
   cXmlEnvelope += [   </soapenv:Body>] + hb_Eol()
   cXmlEnvelope += [</soapenv:Envelope>]

   RETURN cXmlEnvelope

FUNCTION AppUserName(); RETURN ""
FUNCTION AppVersaoExe(); RETURN ""
Agora é aguardar.
Mas queria destacar uma coisa, que só o Harbour tem !!!!

Código: Selecionar todos

   oServer := win_OleCreateObject( "MSXML2.ServerXMLHTTP")
'Sem declarar versão, entra automaticamente a que o Windows escolher.

indicando 5.0
Error WINOLE/1007 Erro de sistema: -2147012890.
(0x80072EE6): msxml5.dll (DOS Error -2147352567)
Called from WIN_OLEAUTO:OPEN(0)
Called from MICROSOFTXMLSOAPPOST(27)
Called from MAIN(17)
sem indicar versão
Error WINOLE/1007 Erro de sistema: -2147012890.
(0x80072EE6): msxml3.dll (DOS Error -2147352567)
Called from WIN_OLEAUTO:OPEN(0)
Called from MICROSOFTXMLSOAPPOST(27)
Called from MAIN(17)
Sem indicar versão foi usada a 3.0 (msxml3.dll).
O Windows tem a versão 3, 4 e 6.
Sacanagem ou não, a versão 5 só tem no Office, e é a única que trata assinatura digital.
Acho que não é o caso aqui, mas só vou confirmar depois que tiver usuário/senha pra fazer mais testes.

o DomDoc: talvez seja interessante se o XML não for gerado pelo aplicativo, pra evitar problemas de codepage, mas acho que também não é o caso ainda.
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/
Responder