В течение последних нескольких месяцев я работал над проектом, который требовал от меня преобразования пользовательского интерфейса Soap, который использовал формат XML, в REST, который должен был использовать JSON, поскольку его нужно было использовать в мобильном приложении.

Что такое МЫЛО

Я знаю, что многие люди знакомы с REST, и я один из них. Только когда я взялся за этот проект, я впервые услышал о SOAP.

SOAP означает простой протокол доступа к объектам. Это протокол, соответствующий строгим стандартам, обеспечивающий связь между клиентом и сервером. Он также использует XML для обмена информацией.

Многие могут задаться вопросом, почему мы вообще использовали SOAP? Это было связано с тем, что необходимые данные поступали из Microsoft Dynamics ERP под названием Navision, а ее стандартом был SOAP.

О разнице между SOAP и REST можно прочитать здесь

Почему я выбрал флягу

Я выбрал flask, а не какой-либо другой фреймворк, такой как django, потому что сначала я относительно лучше понял его, а также Flask имеет небольшой вес, а то, что я хотел, было просто третьей стороной или интерфейсом между системой Navison ERP и мобильным приложением и flask справился с задачей.

Настройка колбы

Flask — один из самых простых фреймворков для настройки на python.

Создайте виртуальную среду

python -m venv <myproject>

Активировать виртуальную среду

source myproject/bin/activate

Установка колбы

pip3 install Flask

Те, кто на python 2.7, могут использовать pip

Мы также должны установить ZEEP, пакет python, который является клиентом SOAP и будет выполнять преобразование из XML в Json.

pip3 install zeep

Система использовала NTLM для аутентификации, и я знаю, что многие «технические братья» могут многое сказать о том, насколько NTLM небезопасен, но «это то, что есть».

Чтобы использовать NTLM, я установил request_ntlm пакет Python, который должен был помочь мне с аутентификацией NTLM.

pip3 install requests-ntlm

Я также установил запросы, которые должны были помочь мне делать запросы https.

pip3 install requests

И мы закончили, это все пакеты, которые нам потребуются для этого проекта.

NTLM-аутентификация

Импортируйте весь модуль в файл main.py.

from flask import Flask, request, jsonify
from zeep import Client
from zeep.transports import Transport
import requests
from requests_ntlm import HttpNtlmAuth

Для аутентификации мы будем использовать запросы и request_ntlm.

session = requests.Session()
session.auth = (HttpNtlmAuth(
    'Username', 'Password'))

Сессия предназначена для того, чтобы мы оставались в системе и не должны входить в систему каждый раз.

Настройка клиента

Нам нужен клиент, который сможет получать данные XML для конвертации.

url = <url>
client = Client(url,
                transport=Transport(session=session))

Мы предоставляем URL-адрес нашей навигационной системе, и наш транспорт будет нашим сеансом.

Преобразование SOAP в JSON

Сначала нам нужно создать переменную фляги

app = Flask(_name_)

Делаем flask get запрос в систему

@app.route('/api/booklist', methods=["GET"])
def booklist():
    return client.service.bookList()

У клиента есть сервисный атрибут. В атрибуте службы мы будем использовать функцию soap или функцию navison bookList(), которая будет отображать все книги в системе как json.

В некоторых случаях функция navision может иметь набор параметров, которые должны быть переданы в нее.

@app.route('/api/book/<bookid>')
def bookdetail(bookid):
    data = {
        "bookId": bookid
    }
    return client.service.FnBookDetails(**data).return_value

В этом случае bookId является обязательным параметром для функции FnBookDetails().

Вы также можете делать почтовые запросы

@app.route('/api/addBook', methods=["POST"])
def returnRecieve():
    req = request.args
    req_dict = req.to_dict()

    data = {
        "bookNo": req_dict['bookNo'],
        "bookName": req_dict['bookName'],
        "ISBN": req_dict['ISBN'],
        "publishedDate": req_dict['publishedDate'],
    }

    return client.service.FnReturnReceiveParts(**data).return_value

И это так просто.

И это так просто сделать преобразование SOAP в JSON 🎉🎉🎉

Удачного взлома 🥳.

Вы можете связаться со мной в twitter или github.