2015-04-24 4 views
2

Я пытаюсь позвонить в службу SOAP из земельного кадастра голландского правительства (WSDL here) с PySimpleSoap. До сих пор я сделал это, чтобы соединиться:Как создать сообщение SOAP с помощью pysimplesoap?

from pysimplesoap.client import SoapClient 
client = SoapClient(wsdl='http://www1.kadaster.nl/1/schemas/kik-inzage/20141101/verzoekTotInformatie-2.1.wsdl') 

и с помощью an awesome answer by Plamen Petrov Теперь я понимаю, мне нужно отправить XML ниже, используя метод client.VerzoekTotInformatie().

Что я не понимаю, так это то, как я могу получить желаемый XML (см. Ниже). Я могу, конечно, создать его вручную, но у меня такое ощущение, что есть более умный/более питонический способ его создания. Могу ли я использовать pysimplesoap для создания этого сообщения xml?

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.kadaster.nl/schemas/kik-inzage/20141101" xmlns:v20="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ns:VerzoekTotInformatieRequest> 
     <v20:Aanvraag> 
      <v20:berichtversie>?</v20:berichtversie> 
      <v20:klantReferentie>ABC</v20:klantReferentie> 
      <v20:productAanduiding>?</v20:productAanduiding> 
      <v20:Ingang> 
       <v20:Object> 
        <v20:IMKAD_KadastraleAanduiding> 
        <v20:gemeente>Amsterdam</v20:gemeente> 
        <v20:sectie>123</v20:sectie> 
        <v20:perceelnummer>456</v20:perceelnummer> 
        <v20:appartementsindex>789</v20:appartementsindex> 
        <v20:deelperceelnummer>10</v20:deelperceelnummer> 
        <v20:AKRKadastraleGemeenteCode>20</v20:AKRKadastraleGemeenteCode> 
        </v20:IMKAD_KadastraleAanduiding> 
       </v20:Object> 
      </v20:Ingang> 
     </v20:Aanvraag> 
     </ns:VerzoekTotInformatieRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

[EDIT]

После примеров в the docs Сейчас я стараюсь добавлять VerzoekTotInformatieRequest с berichtversie в нем, после чего я пытался сделать запрос на мыло-службы. Но, как вы можете видеть ниже, у тела все еще есть пустой <VerzoekTotInformatie> (в нем нет Request), плюс я получаю массивную ошибку. Любые идеи, как я могу построить сообщение выше?

>>> client['VerzoekTotInformatieRequest'] = {'Aanvraag': {'berichtversie': 'yay'}} 
>>> c.VerzoekTotInformatie() 
INFO:pysimplesoap.client:POST https://service1.kadaster.nl/kik/inzage/20141101/VerzoekTotInformatieService 
DEBUG:pysimplesoap.client:SOAPAction: "VerzoekTotInformatie" 
Content-length: 378 
Content-type: text/xml; charset="UTF-8" 
DEBUG:pysimplesoap.client:<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soap:Header/> 
<soap:Body> 
    <VerzoekTotInformatie xmlns="http://www.kadaster.nl/schemas/kik-inzage/20141101"> 
    </VerzoekTotInformatie> 
</soap:Body> 
</soap:Envelope> 
DEBUG:pysimplesoap.client:date: Fri, 24 Apr 2015 12:51:05 GMT 
status: 404 
content-length: 956 
content-type: text/html;charset=utf-8 
DEBUG:pysimplesoap.client:<html><head><title>JBossWeb/2.0.0.GA_CP05 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;b 
ackground-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-s 
erif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 404 - </h1><HR si 
ze="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The requested resource() is not available.</u></p><HR size="1" noshade="noshade"><h3>JBossWeb/2.0.0.GA_CP05</h3></body></html> 
ERROR:pysimplesoap.simplexml:<html><head><title>JBossWeb/2.0.0.GA_CP05 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:whit 
e;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,san 
s-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 404 - </h1><HR 
size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The requested resource() is not available.</u></p><HR size="1" noshade="noshade"><h3>JBossWeb/2.0.0.GA_CP05</h3></body></html> 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "/Library/Python/2.7/site-packages/pysimplesoap/client.py", line 181, in <lambda> 
    return lambda *args, **kwargs: self.wsdl_call(attr, *args, **kwargs) 
    File "/Library/Python/2.7/site-packages/pysimplesoap/client.py", line 346, in wsdl_call 
    return self.wsdl_call_with_args(method, args, kwargs) 
    File "/Library/Python/2.7/site-packages/pysimplesoap/client.py", line 370, in wsdl_call_with_args 
    response = self.call(method, *params) 
    File "/Library/Python/2.7/site-packages/pysimplesoap/client.py", line 262, in call 
    jetty=self.__soap_server in ('jetty',)) 
    File "/Library/Python/2.7/site-packages/pysimplesoap/simplexml.py", line 56, in __init__ 
    self.__document = xml.dom.minidom.parseString(text) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/dom/minidom.py", line 1928, in parseString 
    return expatbuilder.parseString(string) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/dom/expatbuilder.py", line 940, in parseString 
    return builder.parseString(string) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/dom/expatbuilder.py", line 223, in parseString 
    parser.Parse(string, True) 
ExpatError: mismatched tag: line 1, column 944 
+1

Это объясняется в [документах] (https://code.google.com/p/pysimplesoap/w/list). См. Страницу [SoapClient] (https://code.google.com/p/pysimplesoap/wiki/SoapClient) и примеры там. – abarnert

+0

@abarnert - Я посмотрел на эти документы, и насколько я понимаю, мне нужно использовать SimpleXMLElement для создания xml. Но могу ли я также использовать исходное определение 'VerzoekTotInformatieRequest', чтобы как-то использовать и только заполнить недостающие детали? – kramer65

+1

Единственный из тех примеров, которые используют SimpleXMLElement для создания всего XML, является самым последним, «Необработанный пример», который вы используете, только когда вам нужно «-RAW full control (ручная сериализация параметров и десериализация возвращаемых значений) ». Если вам это не нужно, не следуйте этому примеру. – abarnert

ответ

5

Построение xml не является необходимым (или правильным) способом вызова метода мыла. PySimpleSoap уже обеспечил довольно элегантный и человеческий читаемый способ сделать это:

client = SoapClient(wsdl='http://www1.kadaster.nl/1/schemas/kik-inzage/20141101/verzoekTotInformatie-2.1.wsdl', trace=True) 
client.VerzoekTotInformatie(Aanvraag={'berichtversie':4.7, 
             'klantReferentie':'cum murmure', 
             'productAanduiding': 'aeoliam venit'}) 

Журнал отладки будет выглядеть так:

INFO:pysimplesoap.client:POST https://service1.kadaster.nl/kik/inzage/20141101/VerzoekTotInformatieService 
DEBUG:pysimplesoap.client:SOAPAction: "VerzoekTotInformatie" 
Content-length: 842 
Content-type: text/xml; charset="UTF-8" 
DEBUG:pysimplesoap.client:<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Header/> 
     <soap:Body> 
      <VerzoekTotInformatieRequest xmlns="http://www.kadaster.nl/schemas/kik-inzage/20141101"> 
       <Aanvraag xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101"> 
        <berichtversie xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">4.7000000000</berichtversie> 
        <klantReferentie xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">cum murmure</klantReferentie> 
        <productAanduiding xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">aeoliam venit</productAanduiding> 
       </Aanvraag> 
      </VerzoekTotInformatieRequest> 
     </soap:Body> 
</soap:Envelope> 

Как вы можете видеть, XML создается автоматически и отправляется к серверу. Однако я получил ошибку 401: Unauthorized, которую вы, возможно, знаете, как исправить.

+0

Спасибо! Я не знал, что могу просто использовать словари для создания объектов в xml. И я действительно знаю, как исправить 401; вам нужно заплатить за услугу .. :-). Бесконечно благодарен! Я дам вам +100, как только смогу (через 20 минут). – kramer65

+0

Привет @ skyline75489. После огромной помощи, которую вы предоставили мне по моему вопросу, здесь я столкнулся с проблемой с возвращенным xml, создающим TypeError в pysimplesoap ('TypeError: Tag: IMKAD_Perceel недействителен (тип не найден)'). Я создал новый вопрос об этом здесь: http://stackoverflow.com/questions/30258321/typeerror-in-soaprequest-using-pysimplesoap. Вы могли бы знать что-нибудь о том, как исправить ошибку этого типа? – kramer65