هل تمكن أي شخص من الحصول على مكتبة SUDS SOAP للعمل مع Netsuite WSDL؟

StackOverflow https://stackoverflow.com/questions/4400216

  •  25-09-2019
  •  | 
  •  

سؤال

هل تمكن أي شخص من الحصول على مكتبة SUDS SOAP للعمل مع Netsuite WSDL؟ أحصل على هذا الخطأ عندما أحاول إنشاء عميل.

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

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 إنشاء العميل. كما ذكر جون ، فإن الأمر يستغرق إلى الأبد تحليل (أكثر من دقيقتين). لم أحاول استخدام checkasyncstatus لمعرفة ما إذا كان يعمل.

نصائح أخرى

نعم ، يمكن لـ Suds الاتصال بـ 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. إنها ليست مكتبة موثوقة بشكل خاص.

لقد تأخرت قليلاً ، لكن بالنسبة للسجل ، أرفق طريقة لكيفية عمل المرء مع API Suapealk Soap Netsuite باستخدام Python Zeep.

مثال على تسجيل الدخول إلى NetSuite Soap مع Python و Zeep متبوعًا بإضافة عميل.

# pip3 install zeep
from zeep import Client

WSDL_URL = 'https://webservices.sandbox.netsuite.com/wsdl/v2016_1_0/netsuite.wsdl'
NS_EMAIL = 'admin@example.com'
NS_PASSWORD = '*********'
NS_ROLE = '1111'
NS_ACCOUNT = '1111111'
NS_APPID = 'FFFFFFFF-FFFF-0000-0000-FFFFFFFFFFFF'


def login_client():
    client = Client(WSDL_URL)
    Passport = client.get_type('ns1:Passport')
    AppInfo = client.get_type('ns5:ApplicationInfo')
    passport = Passport(email=NS_EMAIL, password=NS_PASSWORD, account=NS_ACCOUNT)
    app_info = AppInfo(applicationId=NS_APPID)
    login = client.service.login(passport=passport,
                                 _soapheaders={'applicationInfo': app_info})
    print('Login Response: ', login.status)
    return client


# Example usage
client = login_client()

# add a customer
Customer = client.get_type('ns14:Customer')
customer = Customer(
    lastName='Joe',
    firstName='Bloggs',
    email='joe@example.com'
)
response = client.service.add(customer)
print(response)

أنظر أيضا: https://github.com/fmalina/python-netsuite

على الرغم من أنها ليست أفضل طريقة للقيام بالأشياء ، إذا كنت يائسة ، يمكنك الاستمرار في تجربة إصدارات مختلفة من 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 Plugin لإصلاح 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()])

إذا كنت ترغب في القيام بإصلاح لمرة واحدة على WSDL المحفوظ بدلاً من القيام بالإصلاح في كل مرة (والذي يستغرق بعض الوقت) ، إليك أمر استبدال 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 (تعتقد أنهم كانوا قد إصلاحه بعد عامين)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top