Summary
This post covers a machine-to-machine use case where the provider has only a SOAP interface to their services but the client can only support a REST interface. One possible solution to that dilemma is to deploy middleware in the form of a proxy between the two entities.
Concept
The diagram below depicts overall the architectural concept. The SOAP API is mediated by a REST API.
App Architecture
The REST proxy is implemented via the FastAPI framework. SOAP interactions are managed via the Zeep package. The HTTP server is provided by Uvicorn. The entire package is deployed as a container via Docker. The SOAP service being used here is simple/toy example here.
Environment Set Up
I'm using Visual Studio Code to develop this in Python. A Python virtual environment can be set up with the command below:
python3 -m venv env
Code
The Python code below implements a REST proxy for two different SOAP endpoints.
client = Client('https://www.w3schools.com/xml/tempconvert.asmx?wsdl') app = FastAPI() @app.get("/CelsiusToFahrenheit") async def celsiusToFahrenheit(temp: int): try: soapResponse = client.service.CelsiusToFahrenheit(temp) fahrenheit = int(round(float(soapResponse),0)) except: raise HTTPException(status_code=400, detail="SOAP request error") else: return {"temp": fahrenheit} @app.get("/FahrenheitToCelsius") async def fahrenheitToCelsius(temp: int): try: soapResponse = client.service.FahrenheitToCelsius(temp) celsius = int(round(float(soapResponse),0)) except: raise HTTPException(status_code=400, detail="SOAP request error") else: return {"temp": celsius}
Container Set Up
Python library requirements for the app are stored to a text file with the command below:
pip freeze > requirements.txtDocker file below:
FROM python:3.9-slim COPY proxy.py proxy.py COPY requirements.txt requirements.txt RUN pip install --no-cache-dir --upgrade -r requirements.txt CMD ["uvicorn", "proxy:app", "--host", "0.0.0.0", "--port", "80"]Screenshot of the resulting container in Studio Code's Docker tool:
Execution
$ curl 'http://localhost/FahrenheitToCelsius?temp=32' {"temp":0}
Source
Copyright ©1993-2024 Joey E Whelan, All rights reserved.