هل تمكن أي شخص من الحصول على مكتبة SUDS SOAP للعمل مع Netsuite WSDL؟
سؤال
هل تمكن أي شخص من الحصول على مكتبة 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 (تعتقد أنهم كانوا قد إصلاحه بعد عامين)