Giter Club home page Giter Club logo

pymtom-xop's Introduction

SOAP MTOM-XOP Support for Python

This library adds SOAP MTOM-XOP support for python 3 using Python Zeep.

The library uses custom classes to override the behavior of Python Zeep, tranforming a basic SOAP message into a MTOM-XOP message before handling it back to Zeep to be sent in a POST request.

Its main actors are the MtomTransport and MtomAttachment classes.

MtomTransport inherits from Zeep's Transport class and overrides its post_xml method.

MtomAttachment is used to represent each file in the request body.

Installation

# from PyPI
pip install pymtom-xop

# or from github
pip install git+https://github.com/Gebrel07/pymtom-xop.git@main

How to use

Consider the following type definitions in a WSDL where the operation name is "UploadFile":

<xs:complexType name="uploadFileWs">
    <xs:sequence>
        <xs:element minOccurs="0" name="file" type="xs:base64Binary"/>
        <xs:element minOccurs="0" name="fileName" type="xs:string"/>
        <xs:element minOccurs="0" name="fileExtension" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

To use this Web Service we can use the MtomTransport and MtomAttachment classes like this:

from pymtom_xop import MtomAttachment, MtomTransport
from zeep import Client, Settings

# create a MtomAttachment instance to represent the file
# the "file" argument can be a file path or a BytesIO object, in this case, lets use a file stored in the "documents" folder
mtom_attachment = MtomAttachment(file="documents/python.pdf")

# use MtomTransport instead of Zeep's standard Tranport
mtom_transport = MtomTransport()
# use the add_files method to add files to the transport
# the "files" argument must be a list of MtomAttachment objects
mtom_transport.add_files(files=[mtom_attachment])

# set up a Client using MtomTransport
client = Client(wsdl="documents/UploadWSDL.wsdl", transport=mtom_transport)

# WARNING: namespace might change according to your Webservice's configuration
factory = client.type_factory(namespace="ns0")

# build SOAP Envelope normally using Zeep
# NOTE: use mtom_attachment's get_cid method to insert the attachment's Content-ID in the "file" field
arg0 = factory.uploadFileWs(
    file=mtom_attachment.get_cid(),
    fileName="python",
    fileExtension="pdf"
)

# call the service normally using Zeep
response = client.service.uploadFile(arg0)

Classes

MTOMAttachment:

The MTOMAttachment class is responsible for setting up all of the necessary information about the file before adding it to the request body.

When inserting a file in the SOAP Envelope, the get_cid method must be used in place of the file's binary data.

Methods

get_cid:

Returns cid without the < > parts

Returns:
    bytes: File's Content-ID

    Example: b"168954589437.10472.2748258243972472116@pymtom-xop"

MTOMTransport:

After calling the service's operation, Zeep will parse the SOAP message as it normally does. The SOAP message and HTTP headers will be passed on to the MTOMTransport class.

MTOMTransport uses its methods to transform the SOAP message into a MTOM-XOP message, adds the necessary HTTP headers and gives it back to Zeep to be sent as a POST request.

MTOMTransport objects will accept any of zeep Tranport arguments when initialized, such as: cache, timeout, operation_timeout, session etc...

Examples

  • See "documents" folder for examples of MTOM Request and Response in XML
  • See "demo.py" for demonstration of a request

References:

See https://docs.python-zeep.org/en/master/ for Python Zeep's official documentaion.

pymtom-xop's People

Contributors

gebrel07 avatar

Stargazers

 avatar  avatar

Watchers

 avatar

pymtom-xop's Issues

When adding more than one file it duplicates the last file given

Hello,

When running the MtomAttachment(file=filename) in a for loop and appeding to a list it overwrites the first file given and duplicates the last.

`from pymtom_xop import MtomAttachment, MtomTransport

procfiles = ["file1.pdf", "file2.pdf"]
mtom_attachments = []
for p in procfiles:
t = MtomAttachment(file=p)
mtom_attachments.append(t)

for row in mtom_attachments:
print(row.file_name) `

file2.pdf
file2.pdf

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.