2014-01-22 3 views
3

mac를 Python 2.7.5 및 suds == 0.4와 함께 사용SUDS가 SOAP 서비스를 사용하는 파일 헤더의 SAXParseException - 비누를 올바르게 소비하는 방법?

wdsl을 사용하여 SOAP 웹 서비스를 사용하기 위해 suds (처음으로)를 사용하고 있습니다. 구문 분석에 실패 할 때 XML 원시를 요청할 때 응답에 대해 혼란스러워합니다. 내가 파이썬 객체에 파싱하지 않고 XML을 반환하도록 클라이언트를 설정

SAXParseException: <unknown>:2:43: not well-formed (invalid token) 

:

from suds.client import Client 
from datetime import datetime 

client = Client('http://domeintabellen-idsw-ws.rws.nl/DomainTableWS.svc?wsdl') 
request = client.factory.create('ns1:GetDomainTableNamesRequest') 
today = datetime.today() 
request.CheckDate = today 
result = client.service['basic'].GetDomainTableNames(request) 

이 나에게 오류를 제공 내가 수익을 얻을

client.set_options(retxml=True) 

있는 내가 할 수있는 수동으로 구문 분석합니다. 그러나 "제대로 작동하고"문제가 무엇인지 더 잘 이해하고 싶습니다.

반환되는 XML은 다음과 같으며 일부 헤더가있는 것으로 보입니다. 각 요청 후에 uuid의 + id가 올라 갔음을 발견했습니다.

--uuid:1d4b4778-364c-4743-8eb3-d72a1e3f7747+id=28 
Content-ID: <http://tempuri.org/0> 
Content-Transfer-Encoding: 8bit 
Content-Type: application/xop+xml;charset=utf-8;type="text/xml" 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetDomainTableNamesResponse xmlns="http://rws.services.nl/DomainTableWS/2010/10"><GetDomainTableNamesResult xmlns:a="http://rws.services.nl/DomainTableWS/Contracts/2010/10" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><a:DomainTableNames><a:string>Aanduiding_naamgebruik</a:string><a:string>Aanslag_type</a:string><a:string>Aanvoereenheid_soorten</a:string><a:string>Aanvoergebied_soorten</a:string><a:string>Aanwezig_afwezig_onbekend</a:string><a:string>Academische_titel</a:string><a:string>Adellijke_titel_of_predikaat</a:string><a:string>Afleveringspunt_soorten</a:string><a:string>Afsluitwijzen</a:string><a:string>Afvoergebied_soorten</a:string><a:string>Afwateringseenheid_soorten</a:string><a:string>AtRisktype</a:string><a:string>BBP_beheerproduct</a:string><a:string>BBP_beleidsproduct</a:string><a:string>Bedrijfstakken_WVOW</a:string><a:string>Beheersvormen_waterkering</a:string><a:string>Belastingsoorten</a:string><a:string>Bemalen_of_vrij_verval</a:string><a:string>Bemonsteringsapparaat</a:string><a:string>Bemonsteringsmethode</a:string><a:string>Bemonsteringssoort</a:string><a:string>Beoordeling_schade</a:string><a:string>BeschermdGebiedtype</a:string><a:string>Bestemmingen_afvalwater</a:string><a:string>Besturingswijze</a:string><a:string>Bevaarbaarheidsklassen</a:string><a:string>BevoegdGezagSoort</a:string><a:string>Beweegbare_bruggen</a:string><a:string>Biotaxon</a:string><a:string>Boomhoogte</a:string><a:string>Brander</a:string><a:string>CEFILT</a:string><a:string>ClassificatieCIW</a:string><a:string>ClassificatieKRWGW</a:string><a:string>ClassificatieKRWbiologischOW</a:string><a:string>ClassificatieKRWchemischOW</a:string><a:string>Code_stroomrichting</a:string><a:string>Code_sturing</a:string><a:string>Compartiment</a:string><a:string>Correspondentie_soorten</a:string><a:string>Detailonderdeel_bijzondere_weglaag</a:string><a:string>Detailplaats_lijnmarkering</a:string><a:string>DoelMeetLocatieType</a:string><a:string>Doelen_baggerwerkzaamheden</a:string><a:string>Doelen_voor_metingen</a:string><a:string>Doorspoelbaarheid</a:string><a:string>Drainerende_werking</a:string><a:string>Druk</a:string><a:string>Drukklassen</a:string><a:string>EBEOkarakteristiek</a:string><a:string>EUfonds</a:string><a:string>Ecologische_verbindingszone_soort</a:string><a:string>Eenheden_voor_precario</a:string><a:string>Eenheid</a:string><a:string>Effecttype</a:string><a:string>Eindbeeld_boomvakdeel</a:string><a:string>Eindbestemmingen_baggerspecie</a:string><a:string>EmissieBrontype</a:string><a:string>Energielevering_soorten</a:string><a:string>FunctieKunstwerk</a:string><a:string>Functies_van_adressen</a:string><a:string>Functies_vastgoedelementen_en_gebieden</a:string><a:string>Gebouwd_onbebouwd</a:string><a:string>Gebruikscodes_objecten</a:string><a:string>Geografische_schalen</a:string><a:string>Graderingen_filterlaag</a:string><a:string>Gras_beheervorm</a:string><a:string>Gras_soorten</a:string><a:string>Groenbeheerniveau</a:string><a:string>Groentype</a:string><a:string>Grondmechanische_aspect_soorten</a:string><a:string>Grondslagen</a:string><a:string>Grootheid_dummy</a:string><a:string>Heffingsobject_soorten</a:string><a:string>Hoedanigheid</a:string><a:string>IWSRindicator</a:string><a:string>Inrichtingtype</a:string><a:string>J_N_of_onbekend</a:string><a:string>J_of_N</a:string><a:string>KRWKwaliteitselement</a:string><a:string>KRWMaatregelGebiedsniveau</a:string><a:string>KRWMaatregeltype</a:string><a:string>KRWMeetLocatietype</a:string><a:string>KRWStatus</a:string><a:string>KRWStroomgebiedsdistrict</a:string><a:string>KRWWatertype</a:string><a:string>KRWhydromorfologische_parameter</a:string><a:string>Kabel_en_leiding_soorten</a:string><a:string>Koppelstuk_soorten</a:string><a:string>Kunstwerktype</a:string><a:string>Kwaliteitsoordeel</a:string><a:string>L_R_B</a:string><a:string>Leidingdeel_soorten</a:string><a:string>LocatietypeWaardeBepaling</a:string><a:string>Lozingsvoorziening_soorten</a:string><a:string>Materialen_voor_afvalwatertransportwerken</a:string><a:string>Materialen_voor_bekleding_waterkering_of_profiel</a:string><a:string>Materialen_voor_kunstwerken</a:string><a:string>Materialen_voor_leidingen</a:string><a:string>Materialen_voor_profielverdedigingen</a:string><a:string>Meetapparaat</a:string><a:string>Meetinstantie</a:string><a:string>Meting</a:string><a:string>Monsterbewerkingsmethode</a:string><a:string>Normgroep</a:string><a:string>Normkader</a:string><a:string>NoseCodetype</a:string><a:string>Onderzoekssoort</a:string><a:string>Onttrekkingsvoorziening_soorten</a:string><a:string>Onttrekkingtype</a:string><a:string>Opmerking_weglaag</a:string><a:string>OppervlakteCategorieStoomgebiedtype</a:string><a:string>Orgaan</a:string><a:string>Overige_vastgoedelement_soorten</a:string><a:string>Parameter</a:string><a:string>Plaatsbepalingsapparaat</a:string><a:string>Processen_RWZI</a:string><a:string>Processen_SVI</a:string><a:string>Processen_transportstelsel</a:string><a:string>Profiellijn_soorten</a:string><a:string>RWZI_soorten</a:string><a:string>Rechtsvormen_bedrijf</a:string><a:string>RedenGebruikLocatie</a:string><a:string>RichtlijnType</a:string><a:string>Rioleringselementen</a:string><a:string>Rioolstelsel_soorten</a:string><a:string>SGBPTitel</a:string><a:string>Scheepvaartteken</a:string><a:string>Soort_zorgplicht_voor_bomen</a:string><a:string>Staat</a:string><a:string>Stuw_soorten</a:string><a:string>Subject_rollen</a:string><a:string>Substraattype</a:string><a:string>TijdDimensietype</a:string><a:string>Tijdelijke_kroon</a:string><a:string>Vaarweg_soorten</a:string><a:string>Veer_typen</a:string><a:string>Verkeersvoorziening_boomvakdeel</a:string><a:string>Vormen</a:string><a:string>Waardebepalingsmethode</a:string><a:string>Waardebepalingstechniek</a:string><a:string>Waardebewerkingsmethode</a:string><a:string>Waarnemingssoort</a:string><a:string>WaterTypeKwantitatief</a:string><a:string>Waterbeheerder</a:string><a:string>Waterbeheergebiedtype</a:string><a:string>Waterkeringtype</a:string><a:string>Waterrijkheidtype</a:string><a:string>Waterstaatkundigezonering</a:string><a:string>WatertypeKwalitatief</a:string><a:string>WegAardtype</a:string><a:string>WetVerordeningtype</a:string><a:string>Zuivering_soorten</a:string><a:string>ZwemplekVoorzieningen</a:string></a:DomainTableNames></GetDomainTableNamesResult></GetDomainTableNamesResponse></s:Body></s:Envelope> 

--uuid:1d4b4778-364c-4743-8eb3-d72a1e3f7747+id=28-- 

이것은 반환 된 문자열과 구문 분석 된 문자열입니다. 비눗물에 당신은 당신의 응답을 테스트하기 위해 메시지를 삽입 할 수 있습니다

response = \ 
"""<enter message here>"""" 

result = client.service['basic'].GetDomainTableNames(__inject={'reply':response}) 

그래서 나는 UUID 및 콘텐츠 헤더없이 XML 문자열에 던져 버리고 그냥 잘 구문 분석. 그러나 그것으로부터 + id를 제거하는 것과 같은 uuid를 사용하여 엉망으로 만들려고 시도했지만 파싱되지 않습니다. 여기 내가 잃어버린 곳이있다. 인코딩 문제가 있다고 생각하지 않습니다. 나는 파싱 오류가 XML 파일의 헤더에 의한 것이라고 가정합니다.

원시 xml을 요청할 때 이러한 헤더가 정상적인 것으로 가정합니다.

해당 uuid의 + 기호가 실패합니까? 그렇다면 왜?

어떻게 비누를 사용하여 구문 분석합니까? 아니면 다른 도서관에 가야합니까?

감사합니다.

+0

나는 또한 soapui로 시도했다. 그러나 정확하게 오류를 찾을 수 없습니다. 하지만 질문에는 'xmlns = "http://rws.services.nl/DomainTableWS/2010/10"과 같은 URL이 있습니다. 그것이 필요한지는 알 수 없지만 호스트는 알 수 없습니다. –

+0

나는 실제로 이번 주말 soapui도 시도했지만 아직 질문을 업데이트하지는 않았다. soapui에 오류가 없습니다. 오류가 발생하면 오류도 발생합니다. – Klodder

답변

2

비눗물은 urllib2가이이

Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "--uuid:49c70d41-cde8-4e80-9834-23051887a718+id=6[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Content-ID: <http://tempuri.org/0>[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Content-Transfer-Encoding: 8bit[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Content-Type: application/xop+xml;charset=utf-8;type="text/xml"[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetDomainTableNamesResponse xmlns="http://rws.services.nl/DomainTableWS/2010/10"><GetDomainTableNamesResult xmlns:a="http://rws.services.nl/DomainTableWS/Contracts/2010/10" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">...</GetDomainTableNamesResponse></s:Body></s:Envelope>[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "--uuid:49c70d41-cde8-4e80-9834-23051887a718+id=6--[\r][\n]" 

서버가있는 응답 데이터를 반환하는 것 같은데 데이터를 HTTP 헤더를 가져옵니다 제대로

헤더

Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "HTTP/1.0 200 OK[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Date: Wed, 29 Jan 2014 12:19:17 GMT[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Server: Microsoft-IIS/6.0[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Set-Cookie: BALANCEID=nwr-iavw-dnt1.node1;path=/;[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "X-Powered-By: ASP.NET[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "X-AspNet-Version: 2.0.50727[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Mime-Version: 1.0[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Cache-Control: private[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Content-Type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:49c70d41-cde8-4e80-9834-23051887a718+id=6";start-info="text/xml"[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "X-Cache: MISS from ...[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "X-Cache-Lookup: MISS from ...:8128[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Via: 1.1 ...:8128 (squid/x.x.STABLE3)[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Connection: close[\r][\n]" 

데이터를 사용하는 경우 SOAP 메시지 및 다른 것들 (--uuid ... 등)

SOAPUI는 아마도 메시지를 찾는 응답 데이터를 다시 구문 분석 (또는 Apache HTTPClient가 예상대로 응답을 처리)하기 때문에 작동하지만, suds는 sud의 Binding 클래스의 replyfilter (줄 58)에 문제가있는 것 같습니다. suds는 해석합니다. 유효한 응답은 Urllib2에서 반환 된 모든 데이터이며 메시지를 다시 구문 분석하지 않습니다.

replyfilter = (lambda s,r: r) 

... 

    reply = self.replyfilter(reply) 

suds0.4 플러그인 기능을 구현, 그래서 당신은 다시 데이터를 구문 분석하는 MessagePlugin를 사용할 수있는 얻는 메시지 만 나는 당신이 쉬운 방법으로도 정규 표현식을 파이썬 전문가를 사용하고 있지 않다 빠른 예를

import logging 
from suds.client import Client 
from datetime import datetime 
from suds.plugin import MessagePlugin 

class Filter(MessagePlugin): 
    def received(self, context): 
     reply = context.reply 
     context.reply = reply[reply.find("<s:Envelope"):reply.rfind(">")+1] 

logging.basicConfig(level=logging.INFO) 
logging.getLogger('suds.transport').setLevel(logging.DEBUG) 

client = Client('http://domeintabellen-idsw-ws.rws.nl/DomainTableWS.svc?wsdl', plugins=[Filter()]) 
request = client.factory.create('ns1:GetDomainTableNamesRequest') 
today = datetime.today() 
request.CheckDate = today 
result = client.service['basic'].GetDomainTableNames(request) 

메시지를 받고 context.reply 콘텐츠를 덮어 씁니다.

이 정보가 도움이되기를 바랍니다.

+0

안녕하세요. 답변 해 주셔서 감사합니다. 나는 나 자신을 시험해 볼 시간이 없지만 이번 주말에 그렇게 할 것이다. – Klodder