Я пытаюсь вызвать простой веб-сервис 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, занимаюсь дайвингтопифоном ...)
Сбой вызова метода 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")
Иов хороший.
По какой-то причине клиент отправляет запрос, используя устаревшую форму, которая почти никогда больше не используется («Кодировка SOAP Раздел 5»). На основании этого вы можете сказать:
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
Но на основе WSDL служба принимает только обычные сообщения SOAP. Так что, скорее всего, что-то не так в части синтаксического анализа WSDL используемой вами библиотеки SOAP.
Пожалуйста, проверьте мой ответ на другой вопрос здесь . .net требует, чтобы действие мыла имело предварительно добавленное пространство имен.