Я пытаюсь вызвать простой веб-сервис SOAP, используя следующий код в интерпретаторе Python:
from SOAPpy import WSDL
wsdl = "http://www.webservicex.net/whois.asmx?wsdl"
proxy = WSDL.Proxy(wsdl)
proxy.soapproxy.config.dumpSOAPOut=1
proxy.soapproxy.config.dumpSOAPIn=1
proxy.GetWhoIS(HostName="google.com")
(Да, я новичок в Python, делаю вещь diveintopython...)
Вызов метода GetWhoIS завершается неудачно - иначе я бы не спросил здесь, я думаю. Здесь мой исходящий SOAP:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body>
<GetWhoIS SOAP-ENC:root="1">
<HostName xsi:type="xsd:string">google.com</HostName>
</GetWhoIS>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
И вот входящий ответ.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>
System.Web.Services.Protocols.SoapException:
Server was unable to process request. --->
System.ArgumentNullException: Value cannot be null.
at whois.whois.GetWhoIS(String HostName)
--- End of inner exception stack trace ---
</faultstring>
<detail />
</soap:Fault>
</soap:Body>
</soap:Envelope>
(отформатировано вручную для упрощения чтения)
Может ли кто-нибудь сказать мне, что я делаю неправильно?
В идеале как с точки зрения использования SOAPpy, так и с неправильным сообщением SOAP.
Спасибо!
Мне кажется, что ваш звонок мне подходит, я думаю, что это может быть сложной проблемой или неправильно сконфигурированным сервером (хотя я не проверил это полностью).
В этом документе также говорится о несовместимости между soappy и webservicex.net: http://users.jyu.fi/~mweber/teaching/ITKS545/exercises/ex5.pdf
Как я обойду это в этом конкретном случае?
import urllib
url_handle = urllib.urlopen( "http://www.webservicex.net/whois.asmx/GetWhoIS?HostName=%s" \
% ("www.google.com") )
print url_handle.read()
Как упоминалось в @ChristopheD, SOAPpy, похоже, не работает для определенных конфигураций WDSL.
Я попробовал использовать suds (sudo easy_install suds на Ubuntu) вместо этого, работал в первый раз.
from suds.client import Client
client = Client('http://www.webservicex.net/whois.asmx?wsdl')
client.service.run_GetWhoIS(HostName="google.com")
Задание хорошего 'un.
По какой-то причине клиент отправляет запрос с использованием устаревшей формы, которая почти никогда не используется ( "SOAP Section 5 encoding" ). Вы можете сказать, основываясь на этом:
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
Но на основе WSDL служба принимает только обычные сообщения SOAP. Итак, скорее всего, что-то не так в части анализа WSDL библиотеки SOAP, которую вы используете.
Пожалуйста, проверьте мой ответ на другой вопрос здесь..net требует, чтобы мыльное действие имело пространство имен.