Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Portuguese
  4. Web Service usando Qtsoap
Forum Updated to NodeBB v4.3 + New Features

Web Service usando Qtsoap

Scheduled Pinned Locked Moved Portuguese
12 Posts 2 Posters 7.9k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    R Offline
    Renatosantos
    wrote on last edited by
    #1

    Hello, vou ser bem direto. Estou precisando enviar um .xml para o web server da sefaz e receber uma resposta. Eu não tenho muita experiencia com web service, mais já li muito a respeito.
    Estou usando o qtsoap que tive que baixar pois não é nativo do Qt.
    No web service tem disponibilizado o WSDL que nada mais é do que a "Descriçao do web service":https://www.sefazvirtual.fazenda.gov.br/NfeRecepcao2/NfeRecepcao2.asmx?WSDL, mas não sei onde estão os métodos e os parametros, tá um pouco confuso. :/

    Tenho tbm os exemplos de soap da NfeRecepcao2, que acredito ser a url pra onde eu tenho que enviar o xml:
    "Exemplo soap em xml":https://www.sefazvirtual.fazenda.gov.br/NfeRecepcao2/NfeRecepcao2.asmx?op=nfeRecepcaoLote2

    Usando o qtsoap, eu não consigo gerar um xml igual ao que está no exemplo.
    meu codigo:
    @
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "nfe.h"
    #include <qtsoap.h>
    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    QtSoapMessage msg;

    transport.setHost("www.sefazvirtual.fazenda.gov.br",443);
    connect(&transport, SIGNAL(responseReady()),this,SLOT(getResponse()));
    
    msg.setMethod("nfeDadosMsg","http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2");
    msg.addMethodArgument("versaoDados","","2.0");
    msg.addMethodArgument("cUF","","MA");
    msg.addMethodArgument("nfeDadosMsg","","C:\\QtSDK\\QtCreator\\NFe\\testaNFe\\arquivo.xml");
    transport.setAction("http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2/nfeRecepcaoLote2");
    transport.submitRequest(msg, "/nfeRecepcao/nfeRecepcao2.asmx");
    
    qDebug() << msg.toXmlString();
    

    void MainWindow::getResponse()
    {
    qDebug() << "getResponse";
    // qDebug()<< "Retorno >" << retorno.toXmlString();
    const QtSoapMessage &resp = transport.getResponse();
    if(resp.isFault())
    qDebug() << resp.faultString().value().toString();

    }
    @

    A Saída do xml é

    @
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
    <SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <nfeDadosMsg >
    <versaoDados xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">2.0</versaoDados>
    <cUF xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">MA</cUF>
    <nfeDadosMsg xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">C:\QtSDK\QtCreator\NFe\testaNFe\arquivo.xml</nfeDadosMsg>
    </nfeDadosMsg>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    @

    Diferente do exemplo, não tem header pois nao sei como fazer usando essa classe qtsoap.
    Alguem tem alguma sugestão?

    Qt Developer.

    "Imagination is more important than knowledge."
    http://twitter.com/Renatos20

    1 Reply Last reply
    0
    • T Offline
      T Offline
      TioRoy
      wrote on last edited by
      #2

      Você pode tentar usar o "gSoap":http://www.cs.fsu.edu/~engelen/soap.html.

      "Aqui":http://qt-project.org/wiki/How_to_use_gSOAP_with_Qt_for_Web_Service_Client tem um passo a passo rápido (em inglês).

      No geral, ele cria classes em C++ que estão expostas no WSDL.

      PS: O site do sefaz não entra aqui, pois dá erro de certificado (client certificate - que o meu browser precisa para acessar).

      1 Reply Last reply
      0
      • R Offline
        R Offline
        Renatosantos
        wrote on last edited by
        #3

        cara, valeu msm, mais o gSoap parece ser mais complicado do que o qtsoap. Tô procurando uma outra maneira de enviar o xml. Tipo por post usando alguma classe do Qt que manipula request e response

        Qt Developer.

        "Imagination is more important than knowledge."
        http://twitter.com/Renatos20

        1 Reply Last reply
        0
        • T Offline
          T Offline
          TioRoy
          wrote on last edited by
          #4

          Sim realmente é. Mas depois do setup, fica mais fácil de usar (é muito semelhante no que existe no Visual Studio quando é adicionado uma referência à um WebService).

          Tem algum outro lugar que consiga o WSDL?

          1 Reply Last reply
          0
          • R Offline
            R Offline
            Renatosantos
            wrote on last edited by
            #5

            Os links estão "aqui":http://www.nfe.fazenda.gov.br/PORTAL/webServices.aspx?tipoConteudo=Wak0FwB7dKs=#SVAN (Sefaz Virtual Ambiente Nacional - (SVAN)):

            Segue o WSDL (eu nem estou certo se é esse (NfeRecepcao2) realmente o que eu tenho que enviar o xml da NFe =/)
            @
            <wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2">
            <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
            Serviço destinado à recepção de mensagens de lote de NF-e.
            </wsdl:documentation>
            wsdl:types
            <s:schema elementFormDefault="qualified" targetNamespace="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2">
            <s:element name="nfeDadosMsg">
            <s:complexType mixed="true">
            <s:sequence>
            <s:any/>
            </s:sequence>
            </s:complexType>
            </s:element>
            <s:element name="nfeRecepcaoLote2Result">
            <s:complexType mixed="true">
            <s:sequence>
            <s:any/>
            </s:sequence>
            </s:complexType>
            </s:element>
            <s:element name="nfeCabecMsg" type="tns:nfeCabecMsg"/>
            <s:complexType name="nfeCabecMsg">
            <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="cUF" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="versaoDados" type="s:string"/>
            </s:sequence>
            <s:anyAttribute/>
            </s:complexType>
            </s:schema>
            </wsdl:types>
            <wsdl:message name="nfeRecepcaoLote2Soap12In">
            <wsdl:part name="nfeDadosMsg" element="tns:nfeDadosMsg"/>
            </wsdl:message>
            <wsdl:message name="nfeRecepcaoLote2Soap12Out">
            <wsdl:part name="nfeRecepcaoLote2Result" element="tns:nfeRecepcaoLote2Result"/>
            </wsdl:message>
            <wsdl:message name="nfeRecepcaoLote2nfeCabecMsg">
            <wsdl:part name="nfeCabecMsg" element="tns:nfeCabecMsg"/>
            </wsdl:message>
            <wsdl:portType name="NfeRecepcao2Soap12">
            <wsdl:operation name="nfeRecepcaoLote2">
            <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Transmissão de Lote de NF-e</wsdl:documentation>
            <wsdl:input message="tns:nfeRecepcaoLote2Soap12In"/>
            <wsdl:output message="tns:nfeRecepcaoLote2Soap12Out"/>
            </wsdl:operation>
            </wsdl:portType>
            <wsdl:binding name="NfeRecepcao2Soap12" type="tns:NfeRecepcao2Soap12">
            <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
            <wsdl:operation name="nfeRecepcaoLote2">
            <soap12:operation soapAction="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2/nfeRecepcaoLote2" style="document"/>
            wsdl:input
            <soap12:body use="literal"/>
            <soap12:header message="tns:nfeRecepcaoLote2nfeCabecMsg" part="nfeCabecMsg" use="literal"/>
            </wsdl:input>
            wsdl:output
            <soap12:body use="literal"/>
            <soap12:header message="tns:nfeRecepcaoLote2nfeCabecMsg" part="nfeCabecMsg" use="literal"/>
            </wsdl:output>
            </wsdl:operation>
            </wsdl:binding>
            <wsdl:service name="NfeRecepcao2">
            <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
            Serviço destinado à recepção de mensagens de lote de NF-e.
            </wsdl:documentation>
            <wsdl:port name="NfeRecepcao2Soap12" binding="tns:NfeRecepcao2Soap12">
            <soap12:address location="https://nfe.fazenda.sp.gov.br/nfeweb/services/nferecepcao2.asmx"/>
            </wsdl:port>
            </wsdl:service>
            </wsdl:definitions>@

            O Qt não tem nem uma classe onde eu possa upar arquivos por POST a um web service? saberia me dizer?

            Qt Developer.

            "Imagination is more important than knowledge."
            http://twitter.com/Renatos20

            1 Reply Last reply
            0
            • T Offline
              T Offline
              TioRoy
              wrote on last edited by
              #6

              O Qt tem a classe QHttp que suporta fazer POST (http://qt-project.org/doc/qt-4.8/qhttp.html). Você poderia usar ela, mas o XML (SOAP) você teria que montar na mão.

              Consegue reenviar o WSDL, mas sem usar o formatador de código do forum? :) Tá inválido.

              1 Reply Last reply
              0
              • T Offline
                T Offline
                TioRoy
                wrote on last edited by
                #7

                Acabei achando o WSDL "aqui":https://code.google.com/p/oseb/source/browse/nfe2/ws/src/org/adempierelbr/nfe/sp/NfeRecepcao2.wsdl?r=7560917dc786f7d4bbbd9793e381a673b4046f0d

                "Postei um exemplo":http://www.4shared.com/zip/S1Febb7C/TesteNfe.html do uso do gsoap mas já com o proxy do wsdl gerado.

                1 Reply Last reply
                0
                • R Offline
                  R Offline
                  Renatosantos
                  wrote on last edited by
                  #8

                  Então, o exemplo que me passastes deu uns erros, :/
                  Eu acabei usando o QXmlStreamWriter para gerar o xml e usando o QNetWorkAccessManeger para envia-lo. Agora tenho um probleminha na hora de passar o xml como parâmetro.
                  Tenho duvida se eu passo o caminho do xml tipo "C:/NFe.xml"
                  ou tenho que abrir o arquivo para leitura e jogar o codigo xml em uma string como eu estou fazendo?
                  @
                  QFile file("c:\QtSDK\QtCreator\NFe\testaNFe\Nfe1234.xml");
                  QXmlStreamWriter stream(&file);
                  stream.writeTextElement("http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2","nfeDadosMsg", xml);
                  @

                  No caso acima o xml passado, é uma string que tem todo o codigo do da NFe.xml já gerado. O problema é que quando eu passo a string xml como parâmetro, da erro nos "<" e ">" que ficam como código "&lt*;" e "&gt*;" (sem os asteriscos) respectivamente, será que o servidor vai fazer o inverso e reconhecer? Como eu posso resolver esse problema?

                  Qt Developer.

                  "Imagination is more important than knowledge."
                  http://twitter.com/Renatos20

                  1 Reply Last reply
                  0
                  • T Offline
                    T Offline
                    TioRoy
                    wrote on last edited by
                    #9

                    Você quer gerar o XML com o QXmlStreamWriter ou ler o conteúdo do arquivo Nfe1234.xml?

                    Se você for gerar o arquivo, realmente você não pode usar alguns caracteres (como "<" e ">"). Você tem que gerar o documento, elemento por elemento (nó/attributo). Como no exemplo da documentação do "QXmlStreamWriter":http://qt-project.org/doc/qt-4.8/qxmlstreamwriter.html#details:

                    @ QXmlStreamWriter stream(&output);
                    stream.setAutoFormatting(true);
                    stream.writeStartDocument();
                    ...
                    stream.writeStartElement("bookmark");
                    stream.writeAttribute("href", "http://qt.nokia.com/");
                    stream.writeTextElement("title", "Qt Home");
                    stream.writeEndElement(); // bookmark
                    ...
                    stream.writeEndDocument();@

                    Mais ou menos assim:

                    @
                    stream.writeStartElement("SOAP-ENV:Envelope");
                    stream.writeAttribute("xmlns:SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/");
                    stream.writeAttribute("SOAP-ENV:encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/");
                    stream.writeAttribute("xmlns:xsd", "http://www.w3.org/1999/XMLSchema");
                    stream.writeEndElement(); // SOAP-ENV:Envelope
                    @

                    1 Reply Last reply
                    0
                    • R Offline
                      R Offline
                      Renatosantos
                      wrote on last edited by
                      #10

                      Sim, sim. blz, essa parte eu já fiz. O problema é que eu passo o xml assim:
                      @
                      stream.writeTextElement("http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2","nfeDadosMsg", xml);
                      @
                      xml é uma string com codigo xml (no caso a NFe que vou enviar ao Web service), nessa string o qdebug retorna legal o codigo xml, por exemplo:
                      @<?xml version="1.0" encoding="UTF-8"?>@

                      mais quando eu passo a string xml por parametro como no codigo acima, no qdebug ela fica assim:

                      @&lt*;?xml version=&quot*;1.0&quot*; encoding=&quot*;UTF-8&quot*;?&gt*; // Sem os asteriscos. Será que o web service reconhece?@

                      Qt Developer.

                      "Imagination is more important than knowledge."
                      http://twitter.com/Renatos20

                      1 Reply Last reply
                      0
                      • T Offline
                        T Offline
                        TioRoy
                        wrote on last edited by
                        #11

                        Você esta fazendo algo assim?

                        @QNetworkRequest request(serviceUrl);
                        networkManager->post(QNetworkRequest(serviceUrl), postData);@

                        Se você está montando o XML "na mão", a variável "xml" é um QString, certo?
                        Neste caso, eu faria o postData ser um QByteArray, criado a partir do QString, +- assim:

                        @
                        QUrl serviceUrl("https://www.sefazvirtual.fazenda.gov.br/NfeRecepcao2/NfeRecepcao2.asmx");
                        QByteArray postData;

                        postData = xml.toAscii();

                        QNetworkRequest request(serviceUrl);
                        networkManager->post(QNetworkRequest(serviceUrl), postData);@

                        1 Reply Last reply
                        0
                        • R Offline
                          R Offline
                          Renatosantos
                          wrote on last edited by
                          #12

                          Valeu cara, era isso msm. tava dando erro de "SSL handshake failed" agora ta dando erro de "Internal Server Error (500)" mais ta andando. Brigadão pela ajuda.

                          Qt Developer.

                          "Imagination is more important than knowledge."
                          http://twitter.com/Renatos20

                          1 Reply Last reply
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved