4

Sudsを使用してSugarCRMSOAPサービス(正しい用語は何ですか?)に接続しようとしています:

from suds.client import Client

url = "http://localhost/sugarcrm/soap.php?wsdl"
client = Client(url)
session = client.service.login("usr", "pwd")

しかし、最後の行は例外をスローします。

ERROR:suds.client:<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns3="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns0="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://www.sugarcrm.com/sugarcrm" xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" 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/>
   <ns2:Body>
      <ns1:login>
         <user_auth xsi:type="ns1:user_auth">usr</user_auth>
         <application_name xsi:type="ns3:string">pwd</application_name>
      </ns1:login>
   </ns2:Body>
</SOAP-ENV:Envelope>
Traceback (most recent call last):
  File "python.py", line 5, in <module>
    session = client.service.login("usr", "pwd")
  File "/usr/lib/pymodules/python2.6/suds/client.py", line 542, in __call__
    return client.invoke(args, kwargs)
  File "/usr/lib/pymodules/python2.6/suds/client.py", line 602, in invoke
    result = self.send(soapenv)
  File "/usr/lib/pymodules/python2.6/suds/client.py", line 653, in send
    result = self.failed(binding, e)
  File "/usr/lib/pymodules/python2.6/suds/client.py", line 714, in failed
    raise Exception((status, reason))
Exception: (404, u'Not Found')
4

3 に答える 3

5

引数もコンストラクターに渡してみてlocation=urlくださいClient。WSDLのlocation要素がサーバーのURIと一致しない場合があります。

client = Client(url, location=url)
于 2011-06-27T23:39:50.807 に答える
2

SUDS接続スタブを使用しているときに同じ問題が発生していました。私はいつもException: (404, u'Not Found')他のすべてがうまく設定されていたので、推測して試し始めました。

特定のSOAPサーバーがこれを引き起こしているのか、それとも手動で場所を設定する必要があるという事実を引き起こしているのかわかりません。解決策は、サービスの名前をロケーションURLに追加することでした。したがって、使用する個別のサービスごとにいくつかのスタブを作成する必要がありますが、それは機能します。

servicename = "TestService"    

client = Client(                                                                                                                                                      
    url="foobar.wsdl",                                                                                                                                              
    location = "http://soap.example.com/foobar/" + servicename ,
)

result = client[servicename]["TestServicePort"].TestServiceFunction()
print(result)

SUDSはそれ自体でこれを行う必要があるため(私は思う)、これは意図された動作ではありませんが、このバグを乗り越えるための唯一のオプションでした。おそらく、属性を手動で指定する必要があったClient.locationため、SUDSは、呼び出す必要のあるサービスに関係なく、属性を変更しなくなりました。

見つけるのに時間がかかったので、これは貧しい人の助けになるに違いない:D

よろしく、マイケル

于 2013-08-06T12:36:16.203 に答える
1

Sudsの使用に夢中になっていない場合は、Python経由でSugarCRMに接続するために取り組んできたPythonライブラリを試してみてください。それはREST対SOAPを超えており、アクセスがはるかに高速になるはずです。

https://github.com/sugarcrm/python_webservices_libraryでチェックしてください

于 2011-06-28T01:14:19.240 に答える