Exemplo n.º 1
0
 def servico(self, nome_wsdl, xml, nome_xsd = None):
     # Validar xml para envio
     if not self.validar(xml, nome_xsd):
         erros = "Erro(s) no XML: "
         for erro in self.erros:
             erros += erro['type_name'] + ': ' + erro['message']
         raise ValueError(erros)
     # Criar meio de transporte criptografado
     transporte = suds.transport.http.HttpTransport()
     transporte.urlopener = urllib2.build_opener(https_ssl(key_file = self.__chave, cert_file = self.__certificado, ca_file = self.__certificadoras))
     # Carrega o wsdl da estrutura de arquivos <raiz>/wsdl/<uf>/<nome_wsdl>.wsdl
     arquivo_wsdl = 'file://' + self.__raiz + '/wsdl/' + self.__sefaz + '/' + self.__str_ambiente + '/' + str(nome_wsdl) + '.wsdl'
     wsdl = suds.client.Client(arquivo_wsdl, transport = transporte)
     # Configurar o ambiente do SOAP
     wsdl.options.cache.clear()
     ns_anterior = suds.bindings.binding.envns
     suds.bindings.binding.envns = ('SOAP-ENV', 'http://www.w3.org/2003/05/soap-envelope')
     # Cria uma função do primeiro serviço, primeira URL (port) e primeiro método, visto que são únicos
     funcao = suds.client.Method(wsdl, wsdl.wsdl.services[0].ports[0].methods.values()[0])
     # Configura o cabeçalho e retorno em XML - Na versão do servidor não tem o parâmetro prettyxml, então tem que comentá-lo para rodar lá
     wsdl.set_options(soapheaders = self.__cabecalho(wsdl, xml('', 1)['versao']), retxml = True, prettyxml = True)
     # Executa a função e coleta o resultado em XML
     resultado = funcao(suds.sax.parser.Parser().parse(string = PoleXML.serializar(xml)).root())
     #resultado = funcao(PoleXML.exportar(xml, -1))
     #print repr(PoleXML.importar(resultado))
     # Voltando o ambiente do SOAP
     suds.bindings.binding.envns = ns_anterior
     # Retornar o resultado na forma da classe XML, somente o corpo do envelope Soap
     return PoleXML.importar(resultado).Envelope.Body('', 1)
Exemplo n.º 2
0
 def servico(self, nome_wsdl, xml, nome_xsd=None, versao_wsdl=None):
     # Validar xml para envio
     if not self.validar(xml, nome_xsd):
         erros = "Erro(s) no XML: "
         for erro in self.erros:
             erros += erro['type_name'] + ': ' + erro['message']
         raise ValueError(erros)
     # Versões do XML e do WSDL
     versao_xml = xml('', 1)['versao'] or xml('', 1)('', 1)['versao']
     if not versao_wsdl:
         versao_wsdl = versao_xml
     # Carrega o wsdl da estrutura de arquivos pela versão do WSDL
     # <raiz>/wsdl/<sefaz>/<ambiente>/<versao>/<nome_wsdl>.wsdl
     arquivo_wsdl = os.path.join(self.__raiz, 'wsdl', self.__sefaz,
                                 self.__str_ambiente, versao_wsdl,
                                 nome_wsdl + '.wsdl')
     # Se não encontrou pela versão do WSDL especificada, vai pela do XML
     if not os.path.exists(arquivo_wsdl):
         arquivo_wsdl = os.path.join(
             self.__raiz, 'wsdl', self.__sefaz,
             self.__str_ambiente, versao_xml, nome_wsdl + '.wsdl')
     arquivo_wsdl = 'file://' + arquivo_wsdl
     # Criar meio de transporte criptografado
     transporte = suds.transport.http.HttpTransport()
     transporte_ssl = (https_ssl_mt
                       if (self.__sefaz == 'MT'
                           or (sys.version_info.major == 2 and
                               sys.version_info.minor < 7))
                       else https_ssl)
     transporte.urlopener = urllib2.build_opener(
         transporte_ssl(key_file=self.__chave, cert_file=self.__certificado,
                        ca_file=self.__certificadoras))
     wsdl = suds.client.Client(arquivo_wsdl, transport=transporte)
     # Configurar o ambiente do SOAP 1.2
     wsdl.options.cache.clear()
     ns_anterior = suds.bindings.binding.envns
     suds.bindings.binding.envns = (
         'soap12', 'http://www.w3.org/2003/05/soap-envelope')
     # Cria uma função do primeiro serviço, primeira URL (port)
     # e primeiro método, visto que são únicos
     funcao = suds.client.Method(wsdl, wsdl.wsdl.
                                 services[0].ports[0].methods.values()[0])
     # Configura os headers http para SOAP 1.2, o cabeçalho e retorno em XML
     wsdl.set_options(soapheaders=self.__cabecalho(wsdl, versao_xml),
                      headers={'Content-Type':
                               'application/soap+xml; charset=utf-8'},
                      retxml=True)
     # Na versão do servidor não tem o parâmetro prettyxml,
     # então tem que comentá-lo para rodar lá
     if sys.version_info.major > 2 or sys.version_info.minor > 6:
         wsdl.set_options(prettyxml=True)
     # Executa a função e coleta o resultado em XML
     resultado = funcao(suds.sax.parser.Parser().parse(
                        string=PoleXML.serializar(xml)).root())
     # Voltando o ambiente do SOAP
     suds.bindings.binding.envns = ns_anterior
     # Retornar o resultado na forma da classe XML,
     # somente o corpo do envelope Soap
     return PoleXML.importar(resultado).Envelope.Body('', 1)
Exemplo n.º 3
0
 def servico(self, nome_wsdl, xml, nome_xsd=None, versao_wsdl=None):
     # Validar xml para envio
     if not self.validar(xml, nome_xsd):
         erros = "Erro(s) no XML: "
         for erro in self.erros:
             erros += erro['type_name'] + ': ' + erro['message']
         raise ValueError(erros)
     # Versões do XML e do WSDL
     versao_xml = xml('', 1)['versao'] or xml('', 1)('', 1)['versao']
     if not versao_wsdl:
         versao_wsdl = versao_xml
     # Carrega o wsdl da estrutura de arquivos pela versão do WSDL
     # <raiz>/wsdl/<sefaz>/<ambiente>/<versao>/<nome_wsdl>.wsdl
     arquivo_wsdl = os.path.join(self.__raiz, 'wsdl', self.__sefaz,
                                 self.__str_ambiente, versao_wsdl,
                                 nome_wsdl + '.wsdl')
     # Se não encontrou pela versão do WSDL especificada, vai pela do XML
     if not os.path.exists(arquivo_wsdl):
         arquivo_wsdl = os.path.join(self.__raiz, 'wsdl', self.__sefaz,
                                     self.__str_ambiente, versao_xml,
                                     nome_wsdl + '.wsdl')
     arquivo_wsdl = 'file://' + arquivo_wsdl
     # Criar meio de transporte criptografado
     transporte = suds.transport.http.HttpTransport()
     transporte_ssl = (https_ssl_mt if
                       (self.__sefaz == 'MT' or
                        (sys.version_info.major == 2
                         and sys.version_info.minor < 7)) else https_ssl)
     transporte.urlopener = urllib2.build_opener(
         transporte_ssl(key_file=self.__chave,
                        cert_file=self.__certificado,
                        ca_file=self.__certificadoras))
     wsdl = suds.client.Client(arquivo_wsdl, transport=transporte)
     # Configurar o ambiente do SOAP 1.2
     wsdl.options.cache.clear()
     ns_anterior = suds.bindings.binding.envns
     suds.bindings.binding.envns = (
         'soap12', 'http://www.w3.org/2003/05/soap-envelope')
     # Cria uma função do primeiro serviço, primeira URL (port)
     # e primeiro método, visto que são únicos
     funcao = suds.client.Method(
         wsdl, wsdl.wsdl.services[0].ports[0].methods.values()[0])
     # Configura os headers http para SOAP 1.2, o cabeçalho e retorno em XML
     wsdl.set_options(
         soapheaders=self.__cabecalho(wsdl, versao_xml),
         headers={'Content-Type': 'application/soap+xml; charset=utf-8'},
         retxml=True)
     # Na versão do servidor não tem o parâmetro prettyxml,
     # então tem que comentá-lo para rodar lá
     if sys.version_info.major > 2 or sys.version_info.minor > 6:
         wsdl.set_options(prettyxml=True)
     # Executa a função e coleta o resultado em XML
     resultado = funcao(suds.sax.parser.Parser().parse(
         string=PoleXML.serializar(xml)).root())
     # Voltando o ambiente do SOAP
     suds.bindings.binding.envns = ns_anterior
     # Retornar o resultado na forma da classe XML,
     # somente o corpo do envelope Soap
     return PoleXML.importar(resultado).Envelope.Body('', 1)
Exemplo n.º 4
0
 def servico(self, nome_wsdl, xml, nome_xsd=None):
     # Validar xml para envio
     if not self.validar(xml, nome_xsd):
         erros = "Erro(s) no XML: "
         for erro in self.erros:
             erros += erro['type_name'] + ': ' + erro['message']
         raise ValueError(erros)
     # Criar meio de transporte criptografado
     transporte = suds.transport.http.HttpTransport()
     transporte.urlopener = urllib2.build_opener(
         https_ssl(key_file=self.__chave,
                   cert_file=self.__certificado,
                   ca_file=self.__certificadoras))
     # Carrega o wsdl da estrutura de arquivos <raiz>/wsdl/<uf>/<nome_wsdl>.wsdl
     arquivo_wsdl = 'file://' + self.__raiz + '/wsdl/' + self.__sefaz + '/' + self.__str_ambiente + '/' + str(
         nome_wsdl) + '.wsdl'
     wsdl = suds.client.Client(arquivo_wsdl, transport=transporte)
     # Configurar o ambiente do SOAP
     wsdl.options.cache.clear()
     ns_anterior = suds.bindings.binding.envns
     suds.bindings.binding.envns = (
         'SOAP-ENV', 'http://www.w3.org/2003/05/soap-envelope')
     # Cria uma função do primeiro serviço, primeira URL (port) e primeiro método, visto que são únicos
     funcao = suds.client.Method(
         wsdl, wsdl.wsdl.services[0].ports[0].methods.values()[0])
     # Configura o cabeçalho e retorno em XML - Na versão do servidor não tem o parâmetro prettyxml, então tem que comentá-lo para rodar lá
     wsdl.set_options(soapheaders=self.__cabecalho(wsdl,
                                                   xml('', 1)['versao']),
                      retxml=True,
                      prettyxml=True)
     # Executa a função e coleta o resultado em XML
     resultado = funcao(suds.sax.parser.Parser().parse(
         string=PoleXML.serializar(xml)).root())
     #resultado = funcao(PoleXML.exportar(xml, -1))
     #print repr(PoleXML.importar(resultado))
     # Voltando o ambiente do SOAP
     suds.bindings.binding.envns = ns_anterior
     # Retornar o resultado na forma da classe XML, somente o corpo do envelope Soap
     return PoleXML.importar(resultado).Envelope.Body('', 1)