Python SUDS E

2024-10-01 11:29:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一个PHP脚本转换成python,但是我一辈子都搞不清下面的代码为什么不起作用。在

从SOAP服务查询返回的结果:

Suds ( https://fedorahosted.org/suds/ )  version: 0.4 GA  build: R699-20100913

Service ( ExternalQueryNameAvailabilityService ) tns="http://asic.gov.au/wsdl/name/availability/external"
Prefixes (6)
  ns0 = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
  ns1 = "http://www.w3.org/2005/05/xmlmime"
  ns2 = "uri:business.document.header.types.asic.gov.au"
  ns3 = "uri:external.query.name.availability.asic.gov.au"
  ns4 = "uri:fss.types.asic.gov.au"
  ns5 = "uri:types.asic.gov.au"
Ports (1):
  (ExternalQueryNameAvailabilityPort)
     Methods (1):
        externalQueryNameAvailability(ns2:businessDocumentHeaderType businessDocumentHeader, ns3:requestDataType businessDocumentBody, )
     Types (113):
        ns0:AttributedDateTime
        ns0:AttributedURI
        ns0:TimestampType
        ns5:abnApplicationReferenceNumberType
        ns5:abnType
        ns5:accountIdentifierType
        ns5:actionType
        ns5:addressType
        ns5:addressTypeType
        ns5:agentNameType
        ns5:agentType
        ns5:amountSignedType
        ns5:amountType
        ns5:applicationStatusType
        ns4:ascotDocumentNoType
        ns5:asicNumericIdType
        ns4:asicPaymentDetailsType
        ns5:asicSignatoryType
        ns2:attachmentType
        ns2:attachmentsType
        ns1:base64Binary
        ns5:birthDetailsType
        ns5:bnReferenceNumberType
        ns5:browserIdentifierType
        ns2:businessDocumentHeaderType
        ns2:businessDocumentRequestHeaderType
        ns5:businessNameIdentifierType
        ns5:codeType
        ns5:creditCardType
        ns4:customerReferenceNumberType
        ns4:debtorType
        ns5:descriptionType
        ns5:distinguishedNameType
        ns5:distinguishedWordType
        ns5:documentIdentifierType
        ns5:documentNoType
        ns5:emailType
        ns5:entityType
        ns5:exceptionListType
        ns5:exceptionType
        ns4:feeType
        ns4:feeWithAmountType
        ns4:feesType
        ns5:flagType
        ns4:fssAccountType
        ns4:fssCustomerType
        ns4:fssItemType
        ns4:fssSimpleAccountType
        ns4:fssTransactionType
        ns2:genericResultType
        ns1:hexBinary
        ns5:inboxIdentifierType
        ns5:intervalStatusType
        ns4:invoiceType
        ns5:itemSearchScopeType
        ns5:itemSummaryType
        ns5:itemTypeType
        ns5:keyType
        ns4:ledgerType
        ns5:lodgementIdentifierType
        ns2:messageEventType
        ns2:messageEventsType
        ns5:messageIdentifierType
        ns2:messageTimestampType
        ns2:messageTimestampsType
        ns5:nameAvailabilityType
        ns5:nameResultType
        ns5:nameResultWithObjectionsType
        ns5:nameType
        ns5:nniNameType
        ns5:nniNumberType
        ns5:objectionType
        ns5:organisationIdentifierType
        ns5:organisationNamePlusIdType
        ns5:originatingChannelType
        ns5:originatingServiceType
        ns5:outboundItemIdentifierType
        ns4:paymentDetailsType
        ns4:paymentMethodType
        ns5:paymentType
        ns5:personNameBirthType
        ns5:personNameType
        ns5:personNameWithRoleType
        ns4:priceType
        ns3:queryNameAvailabilityReplyType
        ns3:queryNameAvailabilityRequestType
        ns5:realmIdentifierType
        ns5:realmQualifierType
        ns4:receiptType
        ns5:referenceNoType
        ns5:rejectedType
        ns3:replyDataType
        ns5:replyType
        ns3:requestDataType
        ns5:requestFailedType
        ns5:requestRejectedType
        ns5:requestType
        ns5:resultType
        ns5:signatoryType
        ns5:soapSoftwareIdentifierType
        ns2:softwareInformationType
        ns5:standardHeaderType
        ns5:standardMessageHeaderType
        ns5:stateTerritoryCodeType
        ns5:statusType
        ns5:streetType
        ns4:suffixType
        ns0:tTimestampFault
        ns5:telephoneNumberType
        ns5:textType
        ns4:transactionType
        ns4:transactionsType
        ns5:trueType

尝试执行以下操作时:

^{pr2}$

我得到以下错误:

DEBUG:suds.client:http failed:
<?xml version='1.0' encoding='UTF-8'?>
  <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
   <S:Body>
    <S:Fault xmlns:ns4="http://schemas.xmlsoap.org/soap/envelope/">
     <S:Code>
      <S:Value>S:Receiver</S:V6alue>
     </S:Code>
     <S:Reason>
      <S:Text xml:lang="en">org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'ns1:businessDocumentHeader'. One of '{"uri:business.document.header.types.asic.gov.au":businessDocumentHeader}' is expected
      </S:Text>
     </S:Reason>
    </S:Fault>
   </S:Body>
  </S:Envelope> 

你知道为什么它会抱怨那个元素吗?-我试过删除元素声明中的“nsX”部分,但还是一样。在

更新:以下是PHP脚本生成并成功的结果;

    <?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="uri:business.document.header.types.asic.gov.au" xmlns:ns2="uri:external.query.name.availability.asic.gov.au">
    <env:Body>
     <ns2:request>
      <ns1:businessDocumentHeader>
        <ns1:messageType>queryNameAvailability</ns1:messageType>
        <ns1:messageReferenceNumber>1</ns1:messageReferenceNumber>
        <ns1:messageVersion>2</ns1:messageVersion>
        <ns1:senderId>192</ns1:senderId>
        <ns1:senderType>REGA</ns1:senderType>
      </ns1:businessDocumentHeader>
      <ns2:businessDocumentBody>
        <ns2:proposedName>TEST</ns2:proposedName>
        <ns2:bnNameAvailabilityCheck>true</ns2:bnNameAvailabilityCheck>
      </ns2:businessDocumentBody>
    </ns2:request>
   </env:Body>
  </env:Envelope>

有人有什么想法吗?在

更新2:我必须安装最新版本的SUDS才能使其正常工作。-非常感谢您的回答。

干杯, 本


Tags: orghttpuritypesgovauxmlnsns1
2条回答

更新(在PHP示例输出之后)

不清楚suds为什么使用{uri:external.query.name.availability.asic.gov.au} 代替businessDocumentHeader元素的{uri:business.document.header.types.asic.gov.au}。在

解决这个问题的快捷而肮脏的方法是使用suds.plugin例如:

from suds.plugin import MessagePlugin

class NsHeaderPlugin(MessagePlugin):
    def sending(self, context):
        context.envelope = context.envelope.replace('ns1:businessDocumentHeader',
                                                    'ns0:businessDocumentHeader')

或者

^{pr2}$

第二个参数应该是ns3:requestDataType,而不是您指定的ns3:businessDocumentBody。在

一般代码流程:

from suds.client import Client # pip install suds

#XXX: change envelope namespace
from suds.bindings import binding
binding.envns = (binding.envns[0], 'http://www.w3.org/2003/05/soap-envelope')
del binding

# change content type
headers = {'Content-Type': 'application/soap+xml; charset="UTF-8"'}
client = Client(wsdl_url, headers=headers, plugins=[NsHeaderPlugin()])

header = client.factory.create('{uri:business.document.header.types.asic.gov.au}'
                               'businessDocumentHeaderType')
header.messageType = "queryNameAvailability"
header.messageReferenceNumber = 1
header.messageVersion = 2
header.senderId = 192
header.senderType = "REGA"

body = client.factory.create('{uri:external.query.name.availability.asic.gov.au}'
                             'requestDataType')
body.proposedName = 'TEST'
body.bnNameAvailabilityCheck = 'true' 

# make the call
result = client.service.externalQueryNameAvailability(header, body)
print result # for debugging, to find out what attributes are available

我没有看到未定义的名称空间,因此在您的情况下,ImportDoctor似乎不是必需的。但是,例如,如果使用了xs:string类型,并且没有提到'http://schemas.xmlsoap.org/soap/encoding/',那么可以修复wsdl模式:

from suds.xsd.doctor import Import, ImportDoctor

imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
# add namespaces where the type is used (call `imp.filter.add` multiple times)
imp.filter.add("http://asic.gov.au/wsdl/name/availability/external") 
doctor = ImportDoctor(imp)

client = Client(wsdl_url, doctor=doctor)

这个错误几乎告诉了您需要查找的确切位置:

      <S:Text xml:lang="en">org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'ns1:businessDocumentHeader'. One of '{"uri:business.document.header.types.asic.gov.au":businessDocumentHeader}' is expected

ns1引用URL http://www.w3.org/2005/05/xmlmime。如果在你的浏览器中访问它,你可以看到它没有太多内容。这进一步排除了ns1是正确的。在

由于ns1:businessDocumentHeader甚至不在由WSDL确定的类型列表中,因此您可能必须使用^{}。我以前在personal project of mine上遇到过类似的问题,其中WSDL没有正确导入类型。在

很抱歉,这个响应不是决定性的,但是由于我看不到您的WSDL,所以很难确定确切的修复方法。尝试修改ImportDoctor的文档,看看这是否有用。在

试着从这个开始:

^{pr2}$

然后将doctor=doctor传递给客户端构造函数。在

相关问题 更多 >