【问题标题】:SAXParseException on file header with SUDS consuming SOAP service - how to consume soap properly?SAXParseException 与 SUDS 使用 SOAP 服务的文件头上的 SAXParseException - 如何正确使用肥皂?
【发布时间】:2014-01-22 10:57:49
【问题描述】:

使用带有 Python 2.7.5 和 suds==0.4 的 mac

我正在使用 suds(第一次)使用 wsdl 来使用肥皂网络服务。当我请求 XML 原始文件时,我对响应感到困惑,因为它无法解析。

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)

这给了我一个错误:

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

我将客户端设置为返回 xml 而不将其解析为 python 对象:

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

我发现这是返回并被解析的字符串。在 suds 中,您可以注入一条消息来测试您的反应:

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

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

所以我输入了没有 uuid 和 Content 标头的 XML 字符串,它解析得很好。但是我试图弄乱uuid,比如从中删除+id,它不会解析。这是我迷路的地方。我不认为我有编码问题。我假设解析错误是由 xml 文件的标题引起的。

当我请求原始 xml 时,我假设这些标头是正常的?

它在那个 uuid 中的 + 符号上失败了吗?如果是,为什么?

如何使用 suds 对其进行解析?还是我应该尝试另一个库?

谢谢!

【问题讨论】:

  • 我也用soapui试过了。但找不到确切的错误。但是有个问题,有像'xmlns="rws.services.nl/DomainTableWS/2010/10"'这样的url。不知道有没有必要,但宿主不详。
  • 这个周末我实际上也尝试了soapui,但还没有更新问题。 soapui没有错误。使用 pysimplesoap 也会发生错误。

标签: parsing python-2.7 soap suds


【解决方案1】:

当 suds 使用 Urllib2 时正确获取 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]"

数据

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

看起来服务器返回带有 SOAP 消息和其他内容(--uuid...等)的响应数据

SOAPUI 可能有效,因为再次解析响应数据以仅查找消息(或 Apache HTTPClient 按预期处理响应),但似乎 suds 在 sud 的 Binding 类的回复过滤器(第 58 行)中存在问题,suds解释为有效响应是Urllib2返回的所有数据,不再解析消息。

    replyfilter = (lambda s,r: r)

...

    reply = self.replyfilter(reply)

suds 0.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)

我不是 python 专家,您也可以使用正则表达式以简单的方式获取消息并覆盖 context.reply 内容。

希望对你有帮助。

【讨论】:

  • 您好,谢谢您的回答。我自己还没有时间尝试,但本周末会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多