Как изменить адрес конечной точки в запросах SOAP с помощью ZEEP

Я использую ZEEP для выполнения запросов SOAP, это просто и отлично работает.

Проблема в том, что URL-адрес конечной точки (в WSDL) неверен.

Я могу решить проблему, отредактировав WSDL напрямую, но это не масштабируется.

Я просмотрел документацию ZEEP о создании сервисных прокси, но я этого не понимаю и у меня есть ошибки. Вот часть WSDL, содержащая неверный URL:

</binding>
<service name="DeviceConfigurationService">
    <port name="DeviceConfigurationPort" 
binding="xrx:DeviceConfigurationBinding">
        <soap:address 
location="http://localhost/webservices/office/device_configuration/1"/>
    </port>
    </service>

место - вот что мне нужно изменить. Мне нужно перейти с "localhost" на IP-адрес локальной сети. Это значение может часто меняться, поэтому мне не нужно каждый раз редактировать WSDL.

Кто-нибудь знает, как это сделать с Zeep?

Любая помощь приветствуется!


person user8571377    schedule 11.04.2018    source источник


Ответы (2)


Я знаю, что этот вопрос старый, но у меня была такая же проблема, когда я обращался к стороннему SOAP API с WSDL, который указывал на неправильную конечную точку (третья сторона сообщила мне правильную конечную точку, но не обновила свой WSDL) . Принятый ответ действительно указал мне правильное направление, но я хотел бы предложить некоторые дополнительные детали, которые не сразу были очевидны для довольно начинающего разработчика, такого как я.

Для начала обратите внимание на то, что документация Zeep показывает, что метод zeep.Client.create_service () имеет два параметра.

имя_ привязки - QName привязки.

address - адрес конечной точки

Выяснение binding_name

Вариант 1. Прочтите WSDL

Имя привязки берется из атрибута binding в WSDL. Проблема в том, что значение этого атрибута обычно включает ссылку на имя в другом месте WSDL, которое необходимо вручную разрешить, прежде чем использовать его для создания настраиваемой службы.

В случае отрывка из OP WSDL (слегка отформатирован и *** выделено ***) ...

<service name="DeviceConfigurationService">
    <port name="DeviceConfigurationPort" ***binding="xrx:DeviceConfigurationBinding"***>
        <soap:address location="http://localhost/webservices/office/device_configuration/1"/>
    </port>
</service>

... значение binding равно "xrx:DeviceConfigurationBinding".

Хотя это binding_name, используемый Zeep, вы не можете просто скопировать и вставить его в параметр create_service(), потому что он частично состоит из xrx - имени, определенного локально в WSDL. Zeep автоматически разрешает значение этого типа имени, когда он первоначально анализирует WSDL, поэтому, когда вы говорите Zeep указать существующую привязку на другую конечную точку, вы должны разрешить имя привязки самостоятельно, чтобы Zeep знал, о какой привязке вы говорите (это почему @jeffgabhart использовал {https://path-to-xrx-namespace} в своем ответе). В итоге у вас должно получиться полное binding_name формата {NAMESPACE}BINDING.

Обратите внимание, что xrx - не единственное возможное имя. Для меня это имя было tns, а для вас это может быть что-то другое. Как бы то ни было, вы сможете найти определение этого имени где-нибудь в WSDL.

Вариант 2. Используйте утилиту синтаксического анализа Zeep WSDL

Другой вариант - предложенный @ 576i. Выполнение команды python -mzeep WSDL_URL выдаст информацию, которую Zeep собирает из данного WSDL. В одном заголовке должно быть указано «Привязки», за которым следует список (возможно, длиной 1) из binding_name. Оттуда вы можете скопировать тот, для которого нужно изменить конечную точку.

Вариант 3 - получить из объекта Zeep Client

Это больше похоже на взлом, но list(zeep_client.wsdl.port_types) дает список всех имен привязок, которые Zeep нашел в WSDL, которые использовались для создания zeep_client.

Выяснение address

Наконец, для полноты картины address - это просто новая конечная точка, которую вы хотите использовать вместо той, которая определена в WSDL.

Надеюсь, это поможет кому-то сгладить кривую обучения!

person jhale1805    schedule 08.01.2021

person    schedule
comment
Не могли бы вы объяснить часть своего ответа путь-к-xrx-namespace? Официальные документы zeep пишут (my-target-namespace-here}, но что именно это и как найти это в оригинальном WSDL? - person 576i; 09.01.2019
comment
Кажется, что пространство имен path-to-xrx-name - это то, которое возвращается инструментом mzeep из раздела using zeep документации zeep. если вы введете здесь неправильное значение, zeep предоставит полезное сообщение об ошибке с правильными параметрами, поэтому, если вы не понимаете его полностью, просто возьмите значение из ошибки ... - person 576i; 09.01.2019