У меня есть фиктивный сервер, построенный с Python / Django, который получает SOAP запросов на представление и возвращает предопределенный набор ответов.
Это отлично работает, но я также хотел бы " proxy "запрос к реальному SOAP API в некоторых случаях.
Моя первоначальная идея состояла в том, чтобы просто получить тело запроса, отправить его в настоящий API и затем вернуть его ответ. Проблема в том, что этот SOAP API использует подпись WS-Security с самозаверяющими сертификатами. Я попытался использовать requests
, но не смог заставить его работать должным образом, так что это моя последняя попытка использовать pycurl:
def post_hr(payload: bytes):
buffer = BytesIO()
curl = pycurl.Curl()
curl.setopt(pycurl.URL, "https://webservices.kvk.nl/postbus2")
curl.setopt(pycurl.SSL_VERIFYPEER, 0)
curl.setopt(pycurl.SSL_VERIFYHOST, 0)
curl.setopt(pycurl.CAINFO, settings.CA_INFO)
curl.setopt(pycurl.SSLCERT, settings.SSL_CERT)
curl.setopt(pycurl.POST, True)
curl.setopt(pycurl.HTTPHEADER, ['SOAPAction: "http://es.kvk.nl/ophalenInschrijving"'])
curl.setopt(pycurl.POSTFIELDS, payload)
curl.setopt(pycurl.WRITEDATA, buffer)
curl.perform()
status = curl.getinfo(pycurl.RESPONSE_CODE)
curl.close()
return status, buffer.getvalue()
def view(request):
...
if something:
status, body = post_hr(request.body)
return HttpResponse(body, status=status)
settings.CA_INFO
и settings.SSL_CERT
- это преобразованные сертификаты вызывающего сервера от jks
до pem
.
Код заставляет API возвращать ответ SOAP с кодом состояния 500
и ошибкой «Недопустимое сообщение».
Я не понимаю, как возникает эта ошибка, поскольку я просто отправляю тот же запрос, который использует соответствующий клиент.