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))
     # 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.exportar(xml, -1)).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)