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)
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)
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)
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)