2017-05-20 2 views
0

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

Répondre

0

J'ai essayé d'utiliser transport_with_attach créé par ellethee et croisais client.attach(filename) comme argument pour URI. Cela semble prometteur et le message a la forme correcte. Cependant, le serveur répond:

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] 
Message: Premature end of file. 

qui a quelque chose à voir avec malformé xml (je pense)

+0

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