2014-09-24 3 views
0

SoapRequest를 보내지 않고 (XML로) 반환하는 방법이 있습니까?Suds/Python을 사용하지 않고 SoapRequest를 작성하십시오.

아이디어는 내 프로그램의 상위 레벨이 부가적인 부울 인수 (시뮬레이션)로 API를 호출 할 수 있다는 것입니다.

If simulation == false then process the other params and send the request via suds 
If simulation == false then process the other params, create the XML using suds (or any other way) and return it to the caller without sending it to the host. 

는 이미 https://fedorahosted.org/suds/wiki/Documentation#MessagePlugin를 follwing을 MessagePlugin을 구현,하지만 난 ...

감사

답변

0

솔루션은 다음과 같습니다 도와

class CustomTransportClass(HttpTransport): 
def __init__(self, *args, **kwargs): 
    HttpTransport.__init__(self, *args, **kwargs) 
    self.opener = MutualSSLHandler() # I use a special opener to enable a mutual SSL authentication 

def send(self,request): 
    print "===================== 1-* request is going ====================" 
    is_simulation = request.headers['simulation'] 
    if is_simulation == "true": 
     # don't actually send the SOAP request, just return its XML 
     print "This is a simulation :" 
     print request.message 
     return Reply(200, request.headers, request.message) 

    return HttpTransport.send(self,request) 


sim_transport = CustomTransportClass() 
client = Client(url, transport=sim_transport, 
      headers={'simulation': is_simulation}) 

감사합니다, 당신의 응답을

1

비눗물의 사용을, XML을 얻을 요청을 중지하고 호출자에게 XML을 다시 보낼 수 없습니다입니다 기본적으로 HttpAuthenticated이라는 '전송'클래스 바로 실제 보내기가 발생하는 곳입니다. 그래서 이론적으로 하위 클래스를 시도해 볼 수 있습니다 :

from suds.client import Client 
from suds.transport import Reply 
from suds.transport.https import HttpAuthenticated 

class HttpAuthenticatedWithSimulation(HttpAuthenticated): 

    def send(self, request): 
     is_simulation = request.headers.pop('simulation', False) 
     if is_simulation: 
      # don't actually send the SOAP request, just return its XML 
      return Reply(200, request.headers.dict, request.msg) 

     return HttpAuthenticated(request) 

... 
sim_transport = HttpAuthenticatedWithSimulation() 
client = Client(url, transport=sim_transport, 
       headers={'simulation': is_simulation}) 

약간 해킹입니다. (예를 들어, 이것은 HTTP 헤더를 사용하여 부울 시뮬레이션 옵션을 전송 레벨로 전달합니다.) 그러나 이것이 아이디어를 보여주기를 바랍니다. 내가 구현

+0

안녕 주셔서 감사합니다. 나는 이미 다른 HttpTransport 클래스를 사용하여 SSL 상호 인증을 수행하고있다. http://stackoverflow.com/questions/6277027/suds-over-https-with-cert. 이론적으로 만약 당신의 샘플을 가지고 send 메소드를 선언했다면 작동할까요? 나는 내일 그것을 시도 할 것이다 – hzrari

+0

제안은 나를 위해 완벽하게 일했다. 방금 ​​작은 수정을했습니다. 솔루션으로 내 게시물을 수정합니다. – hzrari