J'ai réussi à utiliser zeep lors de l'appel de méthodes (distantes) et du téléchargement de pièces jointes.Comment télécharger un fichier via SOAP, en pièce jointe en utilisant python zeep
J'ai maintenant rencontré une méthode qui me demande de télécharger un fichier. Le fichier doit être transmis en pièce jointe. J'appelle normalement une méthode de service Web à distance comme suit:
client.service.fooMethod (arg1, arg2, ...)
Dans mon cas particulier, arg1 est un URI, un fichier que je souhaite télécharger sur le serveur. Il doit être téléchargé en pièce jointe. Comment ferais-je cela?
Voici un exemple plus concret:
Le nom de la méthode est UploadPortfolios et a le schéma suivant:
<xs:element name="UploadPortfolio">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:URI"/>
<xs:element ref="tns:PortfolioID"/>
<xs:element ref="tns:AsOfDate"/>
<xs:element minOccurs="0" ref="tns:SuppressPositionLog"/>
<xs:element minOccurs="0" ref="tns:PositionDetailLogAsAttachment"/>
<xs:element minOccurs="0" ref="tns:UploadSharedPortfolio"/>
</xs:sequence>
</xs:complexType>
</xs:element>
J'utilise zeep en python pour appeler les UploadPortfolios. L'argument uri doit inclure la chaîne cid:<someContentID>
où <someContentID>
est le contenu ID de la pièce jointe:
portfolio_management_wsdl = 'https://ondemand.uat.riskmetrics.com/ondemand/soap/PortfolioManagement?wsdl'
client_pfm = Client(portfolio_management_wsdl, transport=transport, wsse=wsse)
uri = r'cid://SomeDataFile.xml'
args = {'URI':uri, 'AsOfDate':'20160129'}
result = client_pfm.service.UploadPortfolios(**args)
inutile le dire le travail wont ci-dessus, parce que, je dois en quelque sorte d'envoyer dans la pièce jointe.
Utilisation de SoapUI (https://www.soapui.org/downloads/soapui.html) Je peux appeler la fonction sans problème. Voici les données brutes générées par SoapUI et envoyées au serveur (certaines parties ont été omis)
POST https://ondemand.uat.riskmetrics.com/ondemand/soap/PortfolioManagement.PortfolioManagementHttp sSoap12Endpoint/ HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: multipart/related; type="application/xop+xml"; start="<[email protected]>"; start-info="application/soap+xml"; action="urn:RiskMetricsWS:1.0:PortfolioManagement:UploadPortfolio"; boundary="----=_Part_46_453204030.1495210657807"
MIME-Version: 1.0
Content-Length: 7668
Host: ondemand.uat.riskmetrics.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
------=_Part_46_453204030.1495210657807
Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml"; action="UploadPortfolio"
Content-Transfer-Encoding: 8bit
Content-ID: <[email protected]>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsdl="http://..." xmlns:xsd="http://..." xmlns:xsd1="http://...">
<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" ... </soap:Header>
<soap:Body>
<wsdl:UploadPortfolio>
<wsdl:URI><inc:Include href="cid:530345234005" xmlns:inc="http://www.w3.org/2004/08/xop/include"/></wsdl:URI>
<wsdl:PortfolioID>TestPtf_RML4</wsdl:PortfolioID>
<wsdl:AsOfDate>20170509</wsdl:AsOfDate>
<wsdl:SuppressPositionLog>false</wsdl:SuppressPositionLog>
<wsdl:PositionDetailLogAsAttachment>true</wsdl:PositionDetailLogAsAttachment>
<wsdl:UploadSharedPortfolio>true</wsdl:UploadSharedPortfolio>
</wsdl:UploadPortfolio>
</soap:Body>
</soap:Envelope>
------=_Part_46_453204030.1495210657807
Content-Type: text/xml; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-ID: <530345234005>
Content-Disposition: attachment; name="SomeDataFile.xml"
<someInformation>
...
</someInformation>
------=_Part_46_453204030.1495210657807--
Cela ne fournit pas de réponse à la question. Une fois que vous avez suffisamment [réputation] (http://stackoverflow.com/help/whats-reputation) vous pourrez [commenter] (http://stackoverflow.com/help/privileges/comment) sur n'importe quel post. Vérifiez également ceci [que puis-je faire à la place] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). – thewaywewere