2011-05-17 59 views
2

我试图使用suds连接到本地网络上的KnowledgeTree Web服务。我可以创建客户端并检索服务信息,但调用login方法列出的产生suds.WebFault: Server raised fault: 'method "login" not defined in service'Python泡沫 - 未在服务中定义的方法

(注:我不得不使用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' 
+0

啊还有一个不好的WSDL。 – jathanism 2011-05-17 14:45:56

+2

我试图找出零进展。如果其他人遇到同样的问题,我的建议是为自己节省麻烦并使用REST代替。 – 2011-05-20 19:08:07

+0

我认为这是可靠的建议。当WSDL没有正确引用方法时,SOAP可能会是一个巨大的痛苦。另一方面,REST依靠消费者来做正确的事情。 – jathanism 2011-05-25 22:30:40

回答

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 :字符串

+0

我设置了一个MessagePlugin在传出文档中改变它们,并且它仍然引发相同的异常。 – 2011-10-07 16:14:46

3

我有很多问题试图用泡沫来连接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 
+0

有没有可能发布工作信封的例子?你的代码为我生成了同样的'suds.WebFault',但是如果我能确定究竟需要修复什么,这绝对是一个正确的方向。 – 2011-10-07 16:06:48

+0

不幸的是,我们KT安装工作中的肥皂接口似乎损坏了,所以现在无法进行测试。当它再次工作时会回来。 – 2011-10-13 06:14:05