3

誰かがsudssoapライブラリをNetSuiteWSDLで動作させることができましたか?クライアントを作成しようとすると、このエラーが発生します。

from suds.client import Client

#url = 'http://mssoapinterop.org/asmx/simple.asmx?WSDL'
url = 'https://webservices.netsuite.com/wsdl/v2009_2_0/netsuite.wsdl'
client = Client(url)
print client


Traceback (most recent call last):
client = Client(url)
File "build\bdist.win32\egg\suds\client.py", line 112, in __init__
File "build\bdist.win32\egg\suds\reader.py", line 152, in open
File "build\bdist.win32\egg\suds\wsdl.py", line 158, in __init__
File "build\bdist.win32\egg\suds\wsdl.py", line 207, in resolve
File "build\bdist.win32\egg\suds\wsdl.py", line 662, in resolve
File "build\bdist.win32\egg\suds\wsdl.py", line 757, in resolvefaults
Exception: fault 'ExceededRecordCountFault' not defined in portType 'NetSuitePortType'
4

5 に答える 5

5

はい、sudはNetSuiteに接続できますが、WSDLの処理には長い時間がかかります。

サンプルコードは次のとおりです。

# Open NetSuite Session
wsdlNetSuite = 'https://webservices.netsuite.com/wsdl/v2010_1_0/netsuite.wsdl'
client = Client(wsdlNetSuite)

# Login
passport = client.factory.create('ns4:Passport')
passport.email = 'username@web.com'
passport.password = 'ABC123'
passport.account = 123
loginResponse = client.service.login(passport)
print 'Login Response: '
print loginResponse.status

# Get a record
recordRef = client.factory.create('ns4:RecordRef')
recordRef._internalId = 127842
recordRef._type = 'invoice'
record = client.service.get(recordRef)
print record

PythonバージョンとSUDSバージョンのさまざまな組み合わせを試す必要がある場合もあります。特に信頼できるライブラリではありません。

于 2010-12-31T02:41:53.473 に答える
1

毎回修正を行うのではなく (時間がかかる)、保存された WSDL に対して 1 回限りの修正を行いたい場合は、私が使用した VIM 置換コマンドを次に示します。

:%s/RequestLimitFault">\n\t*<soap\:fault name=\"ExceededRecordCountFault/RequestLimitFault\"\>\r\t\t\t\t<soap\:fault name=\"Exce   ededRequestLimitFault/gc

これは2010 Netsuite WSDLで機能し、2012 Netsuite WSDLでも実行する必要がありました(2 年後には修正されていたと思います)。

于 2012-07-25T10:21:39.357 に答える
1

最善の方法ではありませんが、どうしてもやりたい場合は、さまざまなバージョンの wsdl を試し続けることができます。同じエラー メッセージが表示されたので、いずれかが機能するまで試行を続けました。私はこの順序で行きました:

'https://webservices.netsuite.com/wsdl/v2010_2_0/netsuite.wsdl'
'https://webservices.netsuite.com/wsdl/v2010_1_0/netsuite.wsdl'
'https://webservices.netsuite.com/wsdl/v2009_2_0/netsuite.wsdl'
'https://webservices.netsuite.com/wsdl/v2009_1_0/netsuite.wsdl'

「https://webservices.netsuite.com/wsdl/v2009_1_0/netsuite.wsdl」がついに機能しました

編集: tponthieux の回答に基づいて、suds プラグイン機能を使用して wsdl を修正できることがわかりました (彼の回答についてコメントするだけですが、まだ評判はありません :( ):

import re

from suds.client import Client
from suds.plugin import DocumentPlugin

NetSuite_wsdl = 'https://webservices.netsuite.com/wsdl/v2010_2_0/netsuite.wsdl'


class Fix_NS_wsdl(DocumentPlugin):
    bad_fault = re.compile(r"(ExceededRequestLimitFault)"
            r"(\">\s*<soap:fault name=\")(ExceededRecordCountFault)")

    def loaded(self, context):
        if context.url == NetSuite_wsdl:
            context.document = self.bad_fault.sub(r"\1\2\1", context.document)

client = Client(NetSuite_wsdl, plugins=[Fix_NS_wsdl()])
于 2011-01-06T14:08:39.647 に答える
0

https://webservices.netsuite.com/wsdl/v2010_2_0/netsuite.wsdl

この部分の間の検証に失敗していることがわかりました。

<operation name="checkAsyncStatus">
    <input name="checkAsyncStatusRequest" message="tns:checkAsyncStatusRequest"/>
    <output name="checkAsyncStatusResponse" message="tns:checkAsyncStatusResponse"/>
    <fault name="InvalidSessionFault" message="tns:InvalidSessionFault"/>
    <fault name="InvalidCredentialsFault" message="tns:InvalidCredentialsFault"/>
    <fault name="ExceededRequestLimitFault" message="tns:ExceededRequestLimitFault"/> -- mismatch
    <fault name="UnexpectedErrorFault" message="tns:UnexpectedErrorFault"/>
    <fault name="AsyncFault" message="tns:AsyncFault"/>
</operation>

そしてこの部分:

<operation name="checkAsyncStatus">
    <soap:operation soapAction="checkAsyncStatus"/>
    <input name="checkAsyncStatusRequest">
        <soap:header message="tns:headers" part="passport" use="literal"/>
        <soap:header message="tns:headers" part="applicationInfo" use="literal"/>
        <soap:header message="tns:headers" part="partnerInfo" use="literal"/>
        <soap:header message="tns:headers" part="preferences" use="literal"/>
        <soap:body use="literal"/>
    </input>
    <output name="checkAsyncStatusResponse">
        <soap:header message="tns:headers" part="documentInfo" use="literal"/>
        <soap:body use="literal"/>
    </output>
    <fault name="InvalidSessionFault">
        <soap:fault name="InvalidSessionFault" use="literal"/>
    </fault>
    <fault name="InvalidCredentialsFault">
        <soap:fault name="InvalidCredentialsFault" use="literal"/>
    </fault>
    <fault name="ExceededRequestLimitFault">
        <soap:fault name="ExceededRecordCountFault" use="literal"/> -- mismatch
    </fault>
    <fault name="UnexpectedErrorFault">
        <soap:fault name="UnexpectedErrorFault" use="literal"/>
    </fault>
    <fault name="AsyncFault">
        <soap:fault name="AsyncFault" use="literal"/>
    </fault>
</operation>

私はこれを変更しました:

<fault name="ExceededRequestLimitFault">
    <soap:fault name="ExceededRecordCountFault" use="literal"/>
</fault>

これに:

<fault name="ExceededRequestLimitFault">
    <soap:fault name="ExceededRequestLimitFault" use="literal"/>
</fault>

この変更により、Sudsはクライアントを作成できます。ジョンが述べたように、解析には永遠にかかります(2分以上)。checkAsyncStatusを使用して動作するかどうかを確認したことはありません。

于 2011-06-04T22:03:06.293 に答える