В течение последних нескольких месяцев я работал над проектом, который требовал от меня преобразования пользовательского интерфейса 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 🎉🎉🎉
Удачного взлома 🥳.