2016-11-22 10 views
1

При попытке использовать Zeep для создания запроса SOAP для поиска продукта из NetSuite WebService (WSDL https://webservices.sandbox.netsuite.com/wsdl/v2016_1_0/netsuite.wsdl), я использую следующий код:Как удалить лишние заголовки из запроса SOAP с помощью Zeep


result = client.service.search(searchRecord=item_search, _soapheaders={ 
    'searchPreferences': search_preferences, 
    'applicationInfo': app_info, 
    'passport': passport, 
})

Но zeep генерирует XML формы:


<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap-env:Header> 
     <ns0:passport xmlns:ns0="urn:messages_2016_2.platform.webservices.netsuite.com"> 
     <ns1:email xmlns:ns1="urn:core_2016_2.platform.webservices.netsuite.com">[email protected]</ns1:email> 
     <ns2:password xmlns:ns2="urn:core_2016_2.platform.webservices.netsuite.com">somepassword</ns2:password> 
     <ns3:account xmlns:ns3="urn:core_2016_2.platform.webservices.netsuite.com">12345</ns3:account> 
     <ns4:role xmlns:ns4="urn:core_2016_2.platform.webservices.netsuite.com" internalId="1234" type="role" /> 
     </ns0:passport> 
     <ns5:tokenPassport xmlns:ns5="urn:messages_2016_2.platform.webservices.netsuite.com" /> 
     <ns6:applicationInfo xmlns:ns6="urn:messages_2016_2.platform.webservices.netsuite.com"> 
     <ns6:applicationId>ABCDE</ns6:applicationId> 
     </ns6:applicationInfo> 
     <ns7:partnerInfo xmlns:ns7="urn:messages_2016_2.platform.webservices.netsuite.com" /> 
     <ns8:searchPreferences xmlns:ns8="urn:messages_2016_2.platform.webservices.netsuite.com"> 
     <ns8:bodyFieldsOnly>false</ns8:bodyFieldsOnly> 
     <ns8:returnSearchColumns>true</ns8:returnSearchColumns> 
     <ns8:pageSize>20</ns8:pageSize> 
     </ns8:searchPreferences> 
    </soap-env:Header> 
    <soap-env:Body> 
     <ns0:search xmlns:ns0="urn:messages_2016_2.platform.webservices.netsuite.com"> 
     <ns0:searchRecord xmlns:ns3="urn:common_2016_2.platform.webservices.netsuite.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:ItemSearchBasic"> 
      <ns3:isInactive> 
       <ns2:searchValue xmlns:ns2="urn:core_2016_2.platform.webservices.netsuite.com">true</ns2:searchValue> 
      </ns3:isInactive> 
     </ns0:searchRecord> 
     </ns0:search> 
    </soap-env:Body> 
</soap-env:Envelope> 

Обратите внимание, что сгенерированный заголовок содержит параметры, которые я не ставил, как tokenPassport и partnerInfo. Добавленный tokenPassport вместе с паспортом приводит к тому, что конечная точка Netsuite вызывает ошибку неоднозначной аутентификации.

Может ли кто-нибудь любезно указать мне, как удалить tokenPassport из созданных заголовков XML SOAP?

+0

автор zeep здесь. Это может быть просто ошибкой в ​​zeep. Не могли бы вы сообщить о проблеме и приложить пример сценария, как описано в http://docs.python-zeep.org/en/master/reporting_bugs.html#errors-when-creating-the-request? Благодаря :-) – mvantellingen

ответ

0

Мне пришлось вручную удалить tokenPassport, чтобы заставить его работать.

# Manually remove tokenPassport that's being incorrectly added by zeep 
from lxml import etree 
token_passport = envelope.xpath('//x:tokenPassport', 
namespaces {'x':'urn:messages_2016_2.platform.webservices.netsuite.com'}) 
if token_passport: 
token_passport[0].getparent().remove(token_passport[0]) 

https://github.com/procurify/python-zeep/commit/9570007707852caf8e483d4fa9b2b125e73eff1c#diff-e4abfefd4d94bc00a36412733fc6a372