Python suds - 未在服务中定义的方法

时间:2011-05-17 14:17:34

标签: python soap wsdl suds

我正在尝试使用suds连接到本地网络上的KnowledgeTree网络服务。我可以创建客户端并检索服务信息,但调用其中列出的login方法会生成suds.WebFault: Server raised fault: 'method "login" not defined in service'

(注意:在创建客户端时,我必须使用ImportDoctor解决命名空间问题。我不知道当前问题是否可能相关。)

我设置客户端或发送命令的方式有问题,还是服务器端的问题?我可以在必要时更改生成WSDL的服务器上的代码,但我不知道此时需要纠正什么。

设置客户端:

import logging
from suds.client import Client
from suds.xsd.doctor import ImportDoctor, Import
import getpass

logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
url='http://192.168.1.213/knowledgetree/ktwebservice/webservice.php?wsdl'
imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
imp.filter.add('urn:KnowledgeTree')
d = ImportDoctor(imp)
client = Client(url, doctor=d)

print(client)
response = client.service.login(getpass.getuser(), getpass.getpass(), '192.168.1.42')

print(client)的结果:

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

Service ( KnowledgeTreeService ) tns="urn:KnowledgeTree"
   Prefixes (2)
      ns0 = "http://schemas.xmlsoap.org/soap/encoding/"
      ns1 = "urn:KnowledgeTree"
   Ports (1):
      (KnowledgeTreePort)
         Methods (60):
            add_base64_document(xs:string session_id, xs:int folder_id, xs:string title, xs:string filename, xs:string documentype, xs:string base64, )
            add_base64_document_with_metadata(xs:string session_id, xs:int folder_id, xs:string title, xs:string filename, xs:string documentype, xs:string base64, kt_metadata_fieldsets metadata, kt_sysdata sysdata, )
            add_document(xs:string session_id, xs:int folder_id, xs:string title, xs:string filename, xs:string documentype, xs:string tempfilename, )
            add_document_with_metadata(xs:string session_id, xs:int folder_id, xs:string title, xs:string filename, xs:string documentype, xs:string tempfilename, kt_metadata_fieldsets metadata, kt_sysdata sysdata, )
            add_folder(xs:string session_id, xs:int folder_id, xs:string folder_name, )
            add_small_document(xs:string session_id, xs:int folder_id, xs:string title, xs:string filename, xs:string documentype, xs:string base64, )
            anonymous_login(xs:string ip, )
            change_document_owner(xs:string session_id, xs:int document_id, xs:string username, xs:string reason, )
            change_document_type(xs:string session_id, xs:int document_id, xs:string documenttype, )
            checkin_base64_document(xs:string session_id, xs:int document_id, xs:string filename, xs:string reason, xs:string base64, xs:boolean major_update, )
            checkin_base64_document_with_metadata(xs:string session_id, xs:int document_id, xs:string filename, xs:string reason, xs:string base64, xs:boolean major_update, kt_metadata_fieldsets metadata, kt_sysdata sysdata, )
            checkin_document(xs:string session_id, xs:int document_id, xs:string filename, xs:string reason, xs:string tempfilename, xs:boolean major_update, )
            checkin_document_with_metadata(xs:string session_id, xs:int document_id, xs:string filename, xs:string reason, xs:string tempfilename, xs:boolean major_update, kt_metadata_fieldsets metadata, kt_sysdata sysdata, )
            checkin_small_document(xs:string session_id, xs:int document_id, xs:string filename, xs:string reason, xs:string base64, xs:boolean major_update, )
            checkout_base64_document(xs:string session_id, xs:int document_id, xs:string reason, xs:boolean download, )
            checkout_document(xs:string session_id, xs:int document_id, xs:string reason, xs:boolean download, )
            checkout_small_document(xs:string session_id, xs:int document_id, xs:string reason, xs:boolean download, )
            copy_document(xs:string session_id, xs:int document_id, xs:int folder_id, xs:string reason, xs:string options, )
            copy_folder(xs:string session_id, xs:int source_id, xs:int target_id, xs:string reason, )
            create_folder(xs:string session_id, xs:int folder_id, xs:string folder_name, )
            delete_document(xs:string session_id, xs:int document_id, xs:string reason, )
            delete_document_workflow(xs:string session_id, xs:int document_id, )
            delete_folder(xs:string session_id, xs:int folder_id, xs:string reason, )
            download_base64_document(xs:string session_id, xs:int document_id, )
            download_document(xs:string session_id, xs:int document_id, )
            download_small_document(xs:string session_id, xs:int document_id, )
            get_client_policies(xs:string session_id, xs:string client, )
            get_document_detail(xs:string session_id, xs:int document_id, xs:string detail, )
            get_document_detail_by_filename(xs:string session_id, xs:int folder_id, xs:string filename, xs:string detail, )
            get_document_detail_by_name(xs:string session_id, xs:int folder_id, xs:string document_name, xs:string what, xs:string detail, )
            get_document_detail_by_title(xs:string session_id, xs:int folder_id, xs:string title, xs:string detail, )
            get_document_link_types(xs:string session_id, )
            get_document_links(xs:string session_id, xs:int document_id, )
            get_document_metadata(xs:string session_id, xs:int document_id, )
            get_document_transaction_history(xs:string session_id, xs:int document_id, )
            get_document_type_metadata(xs:string session_id, xs:string document_type, )
            get_document_types(xs:string session_id, )
            get_document_version_history(xs:string session_id, xs:int document_id, )
            get_document_workflow_state(xs:string session_id, xs:int document_id, )
            get_document_workflow_transitions(xs:string session_id, xs:int document_id, )
            get_documents_by_oem_no(xs:string session_id, xs:string oem_no, xs:string detail, )
            get_folder_contents(xs:string session_id, xs:int folder_id, xs:int depth, xs:string what, )
            get_folder_detail(xs:string session_id, xs:int folder_id, )
            get_folder_detail_by_name(xs:string session_id, xs:string folder_name, )
            get_workflows(xs:string session_id, )
            link_documents(xs:string session_id, xs:int parent_document_id, xs:int child_document_id, xs:string type, )
            login(xs:string username, xs:string password, xs:string ip, )
            logout(xs:string session_id, )
            move_document(xs:string session_id, xs:int document_id, xs:int folder_id, xs:string reason, xs:string options, )
            move_folder(xs:string session_id, xs:int source_id, xs:int target_id, xs:string reason, )
            perform_document_workflow_transition(xs:string session_id, xs:int document_id, xs:string transition, xs:string reason, )
            rename_document_filename(xs:string session_id, xs:int document_id, xs:string newfilename, )
            rename_document_title(xs:string session_id, xs:int document_id, xs:string newtitle, )
            rename_folder(xs:string session_id, xs:int folder_id, xs:string newname, )
            search(xs:string session_id, xs:string search, xs:string options, )
            start_document_workflow(xs:string session_id, xs:int document_id, xs:string workflow, )
            stop_document_workflow(xs:string session_id, xs:int document_id, )
            undo_document_checkout(xs:string session_id, xs:int document_id, xs:string reason, )
            unlink_documents(xs:string session_id, xs:int parent_document_id, xs:int child_document_id, )
            update_document_metadata(xs:string session_id, xs:int document_id, kt_metadata_fieldsets metadata, kt_sysdata sysdata, )
         Types (89):
            ns0:Array
            ns0:ENTITIES
            ns0:ENTITY
            ns0:ID
            ns0:IDREF
            ns0:IDREFS
            ns0:NCName
            ns0:NMTOKEN
            ns0:NMTOKENS
            ns0:NOTATION
            ns0:Name
            ns0:QName
            ns0:Struct
            ns0:anyURI
            ns0:arrayCoordinate
            ns0:base64
            ns0:base64Binary
            ns0:boolean
            ns0:byte
            ns0:date
            ns0:dateTime
            ns0:decimal
            ns0:double
            ns0:duration
            ns0:float
            ns0:gDay
            ns0:gMonth
            ns0:gMonthDay
            ns0:gYear
            ns0:gYearMonth
            ns0:hexBinary
            ns0:int
            ns0:integer
            kt_client_policies_array
            kt_client_policies_response
            kt_client_policy
            kt_document_collection
            kt_document_collection_response
            kt_document_detail
            kt_document_transaction_history
            kt_document_transaction_history_item
            kt_document_transaction_history_response
            kt_document_types_array
            kt_document_types_response
            kt_document_version_history
            kt_document_version_history_item
            kt_document_version_history_response
            kt_folder_collection
            kt_folder_collection_response
            kt_folder_contents
            kt_folder_detail
            kt_folder_item
            kt_folder_items
            kt_linked_document
            kt_linked_document_response
            kt_linked_documents
            kt_metadata_field
            kt_metadata_fields
            kt_metadata_fieldset
            kt_metadata_fieldsets
            kt_metadata_options
            kt_metadata_response
            kt_metadata_selection
            kt_metadata_selection_item
            kt_response
            kt_search_response
            kt_search_result_item
            kt_search_results
            kt_sysdata
            kt_sysdata_item
            kt_workflow_transitions
            kt_workflow_transitions_response
            kt_workflows_array
            kt_workflows_response
            ns0:language
            ns0:long
            ns0:negativeInteger
            ns0:nonNegativeInteger
            ns0:nonPositiveInteger
            ns0:normalizedString
            ns0:positiveInteger
            ns0:short
            ns0:string
            ns0:time
            ns0:token
            ns0:unsignedByte
            ns0:unsignedInt
            ns0:unsignedLong
            ns0:unsignedShort

client.service.login(username, password, address)的调试结果:

DEBUG:suds.client:sending to (http://192.168.1.213/knowledgetree/ktwebservice/webservice.php)
message:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns0="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Header/>
   <ns1:Body>
      <ns1:login>
         <username xsi:type="ns2:string">*removed*</username>
         <password xsi:type="ns2:string">*removed*</password>
         <ip xsi:type="ns2:string">192.168.1.42</ip>
      </ns1:login>
   </ns1:Body>
</SOAP-ENV:Envelope>
DEBUG:suds.client:headers = {'SOAPAction': u'"http://schemas.xmlsoap.org/soap/envelope/#KTWebService#login"', 'Content-Type': 'text/xml; charset=utf-8'}
ERROR:suds.client:<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns0="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Header/>
   <ns1:Body>
      <ns1:login>
         <username xsi:type="ns2:string">*removed*</username>
         <password xsi:type="ns2:string">*removed*</password>
         <ip xsi:type="ns2:string">192.168.1.42</ip>
      </ns1:login>
   </ns1:Body>
</SOAP-ENV:Envelope>
DEBUG:suds.client:http failed:
<?xml version="1.0" encoding="UTF-8"?>



<SOAP-ENV:Envelope  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

 xmlns:xsd="http://www.w3.org/2001/XMLSchema"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"

 SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Body>



<SOAP-ENV:Fault>

<faultcode xsi:type="xsd:QName">SOAP-ENV:Server</faultcode>

<faultstring xsi:type="xsd:string">method &quot;login&quot; not defined in service</faultstring>

<faultactor xsi:type="xsd:anyURI"></faultactor>

<detail xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:anyType[6]" SOAP-ENC:offset="[0]">

<item>

<object xsi:nil="true"/></item>

<item>

<object xsi:nil="true"/></item>

<item>

<object>

<fault xsi:nil="true"/></object></item>

<item>

<object>

<fault xsi:nil="true"/></object></item>

<item>

<object>

<fault xsi:nil="true"/></object></item>

<item>

<object xsi:nil="true"/></item></detail></SOAP-ENV:Fault>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>



Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    response = client.service.login(getpass.getuser(), getpass.getpass(), '192.168.1.42')
  File "build\bdist.win32\egg\suds\client.py", line 542, in __call__
    return client.invoke(args, kwargs)
  File "build\bdist.win32\egg\suds\client.py", line 602, in invoke
    result = self.send(soapenv)
  File "build\bdist.win32\egg\suds\client.py", line 649, in send
    result = self.failed(binding, e)
  File "build\bdist.win32\egg\suds\client.py", line 702, in failed
    r, p = binding.get_fault(reply)
  File "build\bdist.win32\egg\suds\bindings\binding.py", line 265, in get_fault
    raise WebFault(p, faultroot)
WebFault: Server raised fault: 'method "login" not defined in service'

2 个答案:

答案 0 :(得分:3)

我在尝试使用suds连接到KT时遇到了很多问题。以下是我最终使用的模块。

from suds.client import Client
from suds.xsd.doctor import ImportDoctor, Import
from suds.plugin import Plugin

import urllib

class SessionProxy:
    """
    All methods (except login) wants sessionid as first argument
    This proxy adds that.
    """
    def __init__(self, service, session, baseurl):
        self.service = service
        self.session = session
        self.baseurl = baseurl

    def open(self, docid):
        u = self.download_document(docid)
        return urllib.urlopen(self.baseurl + u.message)

    def __getattr__(self, attr):
        a = getattr(self.service, attr)
        if callable(a):
            def _(*args):
                return a(self.session, *args)
            return _
        return a

class AdjustPrefixes(Plugin):
    def sending(self, ctx):
        ctx.envelope.refitPrefixes()

class AttrFixer(Plugin):
    def __init__(self, attrs):
        self.attrs = attrs

    def received(self, ctx):
        # ideally this should parse the xml and rewrite the dom..
        for fr, to in self.attrs:
            ctx.reply = ctx.reply.replace("<%s " % fr, "<%s " % to)
            ctx.reply = ctx.reply.replace("</%s" % fr, "</%s" % to)


def connect(baseurl, user, password):
    url = "%s/ktwebservice/webservice.php?wsdl" % baseurl

    imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
    doctor = ImportDoctor(imp)
    client = Client(url, plugins=[doctor,
                                  AdjustPrefixes(),
                                  AttrFixer([(a.replace("_",""), a) for a in ["checked_out_by", "modified_by"]])])
    srv = client.service
    r = srv.login(user,password,"127.0.0.1")
    if r.status_code != 0:
        raise RuntimeError, "failed to login"
    s = SessionProxy(srv, r.message, baseurl)
    return s

答案 1 :(得分:1)

<ns1:login>
    <username xsi:type="ns2:string">*removed*</username>
    <password xsi:type="ns2:string">*removed*</password>
    <ip xsi:type="ns2:string">192.168.1.42</ip>
</ns1:login>

ns0:字符串是正确的,而不是ns2:string