![Page 2: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/2.jpg)
Mi a baj a REST-el?
![Page 3: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/3.jpg)
Mikor használjunk SOAP-ot?
● Magas biztonság (WS-Sec, XMLSec, SAML)
● Aszinkron szolgáltatás● Állapottartó szolgáltatás (WS-Addressing)● Ipari környezet, sokféle nem ismert kliens● Interface specifikació formálisan kell● Service felfedezés
![Page 4: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/4.jpg)
Problémák
![Page 5: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/5.jpg)
Típusos interfész vs.
nem erősen típusos nyelv
![Page 6: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/6.jpg)
Python SOAP lib?
● SOAPpy – nem standard, nehézkes tipus kezelés
● ZSI – nem standard, túl körülményes típus kezelés
● soaplib – névterek kezelésének hiánya
![Page 7: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/7.jpg)
decorator_with_args = lambda decorator: lambda *args, **kwargs: lambda func: decorator(func, *args, **kwargs)
@decorator_with_argsdef soapmethod(func, *params, **kwparams): @functools.wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) wrapper.__doc__ = func.__doc__ wrapper.__name__ = func.__name__ wrapper.soap_descriptor = FunctionDescriptor(func, *params, **kwparams) return wrapper
![Page 8: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/8.jpg)
Sebesség: lxml!
![Page 9: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/9.jpg)
![Page 10: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/10.jpg)
Szolgáltatás
![Page 11: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/11.jpg)
from soaplib.serializers.primitive import String, DateTimefrom soaplib.serializers.clazz import ClassSerializer
class Organization(ClassSerializer): class types: name = String domain_name = String created = DateTime account_id = String def __init__(self, obj=None): super(Organization, self).__init__() if obj is not None: self.name = obj.name self.domain_name = obj.domain_name self.created = obj.created self.account_id = obj.account_id
class OrganizationService(DjangoSOAP): __tns__ = 'urn:genie:service:api'
@soapmethod(String, identity.soap_data.Identity, soap_data.Organization, order.soap_data.Customer, _returns=soap_data.Organization) def create(self, token, admin, org, customer): [...]
o = Organization.objects.get(...) [...] return soap_data.Organization(o)
![Page 12: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/12.jpg)
class String(object): def __init__(self, ns=None): self._xs_type_ = 'xs:string' self.__tns__ = ns
def to_xml(self, name, value, ns=None, nsmap={}): if value is None: return Null.to_xml(name, value, ns, nsmap) if type(value) != unicode: value = unicode(value, 'utf-8') element = create_element(name, ns, nsmap) element.text = value element.set('{%s}type' % XSI_NS, self._xs_type_) return element
def from_xml(self, element): type = element.get('{%s}type' % XSI_NS, self._xs_type_) if type != self._xs_type_: raise InvalidXSDTypeError() if element.text is None: return None try: u = unicode(element.text) return u.encode('utf-8') except: return element.text
![Page 13: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/13.jpg)
Kliens
![Page 14: Ne legyünk REST-ek továbblépni, azaz SOAP web szolgáltatások](https://reader038.vdocuments.site/reader038/viewer/2022100517/555672cdd8b42abc5a8b4e2f/html5/thumbnails/14.jpg)
from service import soapmethod, SoapServicefrom serializers.primitive import String, Integerfrom serializers.clazz import ClassSerializerfrom client import SoapClient
class GetBalanceRequestType(ClassSerializer): __tns__ = 'urn:ebay:apis:eBLBaseComponents' class types: Version = String GetAllCurrencies = String
class PayPalService(SoapService): __tns__ = 'urn:ebay:api:PayPalAPI' @soapmethod(GetBalanceRequestType) def GetBalanceReq(self, GetBalanceRequest): pass
c = SoapClient('https://foo', PayPalService(), 'cert_key.pem')print c.GetBalanceReq(GetBalanceRequestType(Version="55.0", GetAllCyrrencies="1"), headers=soap_headers)