2017-05-20 14 views
0

(원격) 메서드를 호출하고 첨부 파일을 다운로드 할 때 zeep을 성공적으로 사용했습니다.python zeep을 사용하여 SOAP을 통해 파일을 업로드하는 방법

나는 파일을 업로드해야하는 방법을 발견하게되었습니다. 파일을 첨부 파일로 전달해야합니다. 다음과 같이 내가 일반적으로 원격 웹 서비스 메소드를 호출

client.service.fooMethod 내 특정 경우 (ARG1, ARG2를, ...)

을 ARG1는 URI, 내가 업로드하고자하는 파일입니다 서버. 첨부 파일로 업로드해야합니다. 어떻게하면됩니까?

메소드 이름이 UploadPortfolios하고 다음 스키마 있습니다 :

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

나는 UploadPortfolios의 호출을 파이썬에서 zeep를 사용을 여기

는보다 구체적인 예이다. 어떻게 든 내가 첨부 파일로 전송해야하기 때문에

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) 

불필요한은 위의 실 거예요 작업을 말한다 : <someContentID>는 첨부 파일의 콘텐츠 ID이고 열린 우리당 인수는 문자열 cid:<someContentID>을 포함 할 필요가있다.

SoapUI (https://www.soapui.org/downloads/soapui.html)를 사용하면 문제없이 함수를 호출 할 수 있습니다. 다음은 원시 데이터 (일부 생략 된) SoapUI 의해 생성되고 서버에 전송

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

답변

0

I가 ellethee 의해 생성 transport_with_attach을 사용했는데 URI에 대한 인수로서 client.attach(filename) 전달된다. 그것은 유망 해 보이고 메시지에는 정확한 모양이있다. 서버가 응답 그러나 : 잘못된 형식의 XML을 함께 할 수있는 뭔가가

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

+0

이 질문에 대한 답을 제공하지 않습니다 (나는 생각한다). 충분한 [평판] (http://stackoverflow.com/help/whats-reputation)이 있으면 어떤 글에도 [comment] (http://stackoverflow.com/help/privileges/comment) 할 수 있습니다. 또한 이것을 확인하십시오. [대신 할 수있는 방법] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reference-to-comment-what-can-i-do-instead). – thewaywewere