2013-03-06 3 views
4

suds python을 사용하여 WebService의 데이터를 소비하는 Python 클라이언트 응용 프로그램을 작성하고 있습니다. 지금은 원격 통화를하고 응답을받을 수 있습니다. 제 문제는 응답 크기가 크다는 것입니다 - 지금은 100Mb이고 크기는 앞으로 커질 것입니다. 웹 서비스 공급자에게 API를 업데이트하도록 요청했습니다.이 API를 사용하면 나에게 모델을 요청할 수 있지만 현재는별로 도움이되지 않습니다. 즉, 난 단지 큰 응답 페이로드에 대한 사용자 지정 응답 XML 파서를 사용하도록 suds 구성

  • 필요한 정보를 추출하고 suds.sax.parser을 실행 방지하고 할 것 -

    • 는 응답 메시지에 대한 사용자 정의 스트림 파서를 사용 :

      는 비눗물 클라이언트를 구성 할 수있는 방법을 제안하십시오
    • 또한 내 파서가 디스크의 파일에 직접 저장하고 메모리에 저장하지 않도록하고 싶습니다. (후자를 구현하려면 사용자 지정 suds 전송을 전달해야한다고 생각합니다. 나를 위해 그렇게해라)
  • 답변

    4

    내 작업에 대한 내 질문에 대한 해결책을 찾았습니다. suds.plugin.MessagePlugin 구현을 사용하여 WebService 응답 페이로드를 저장하지 않고 비눗물이 DOM으로 파싱되는 것을 방지합니다. 내 원래의 질문에 항목 2 :

    피할 실행 suds.sax.parser 및 전체 응답 트리를 포함한 DOM 객체를 구축하지 않는

    다음

    공개 웹 서비스와이 방법을 사용하는 예 .

    gist

    import suds 
        class PayloadInterceptor(suds.plugin.MessagePlugin): 
         def __init__(self, *args, **kwargs): 
          self.last_payload = None 
    
         def received(self, context): 
          #recieved xml as a string 
          print "%s bytes received" % len(context.reply) 
          self.last_payload = context.reply  
          #clean up reply to prevent parsing 
          context.reply = "" 
          return context 
    
        if __name__=='__main__':  
         wsurl = "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL" 
         payload_interceptor = PayloadInterceptor() 
         client = suds.client.Client(wsurl, plugins=[payload_interceptor]) 
         print client 
         res = client.service.CapitalCity("NL") 
         print "received %s bytes" % len(payload_interceptor.last_payload) 
         print "parsed result: %s" % res 
         print "response payload: %s" % payload_interceptor.last_payload  
    

    농산물 출력에 전체 코드를 참조하십시오

    ...  
        received 336 bytes 
        parsed result: None 
        response payload: <?xml version="1.0" encoding="utf-8"?> 
        <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
         <soap:Body> 
         <m:CapitalCityResponse xmlns:m="http://www.oorsprong.org/websamples.countryinfo"> 
          <m:CapitalCityResult>Amsterdam</m:CapitalCityResult> 
         </m:CapitalCityResponse> 
         </soap:Body> 
        </soap:Envelope> 
    
    2

    당신은 구문 분석 및 느린 오브젝트 트리 건물을 우회, 비눗물 원시 XML 응답을 반환하게 retxml 옵션을 사용할 수 있습니다 . 자세한 내용을 보려면 https://fedorahosted.org/suds/ticket/257.