2016-11-22 1 views
1

Lorsque vous tentez d'utiliser Zeep pour créer une requête SOAP pour la recherche de produits de NetSuite webservice (WSDL https://webservices.sandbox.netsuite.com/wsdl/v2016_1_0/netsuite.wsdl), j'utilise le code suivant:Comment supprimer les en-têtes redondants de requête SOAP en utilisant Zeep


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

Mais zeep génère XML de la forme:


<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> 

Notez que l'en-tête généré contient des paramètres que je ne l'ai pas Posé comme tokenPassport et PartnerInfo. Le tokenPassport ajouté avec passeport conduit le noeud final Netsuite à lancer une erreur d'authentification ambiguë.

Est-ce que quelqu'un pourrait me montrer comment retirer le tokenPassport des en-têtes XML SOAP générés?

+0

auteur de zeep ici. Cela pourrait juste être un bug dans zeep. Pourriez-vous signaler un problème et joindre un exemple de script tel que documenté à l'adresse http://docs.python-zeep.org/fr/master/reporting_bugs.html#errors-wh-creating-the-request? Merci :-) – mvantellingen

Répondre

0

J'ai dû retirer manuellement le tokenPassport pour que cela fonctionne.

# 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