Что не так с моим вызовом Python SOAPpy webservice? - PullRequest
1 голос
/ 25 марта 2009

Я пытаюсь вызвать простой веб-сервис 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. ---&gt;
           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.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 25 марта 2009

Мне кажется, что ваш звонок в порядке, я думаю, что это может быть серьезная проблема или неправильно настроенный сервер (хотя я не проверил это тщательно).

Этот документ также предлагает несовместимости между 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()
2 голосов
/ 25 марта 2009

Как упомянул @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")

Иов хороший.

1 голос
/ 01 октября 2009

По какой-то причине клиент отправляет запрос, используя устаревшую форму, которая почти никогда больше не используется («Кодировка SOAP Раздел 5»). На основании этого вы можете сказать:

SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

Но на основе WSDL служба принимает только обычные сообщения SOAP. Так что, скорее всего, что-то не так в части синтаксического анализа WSDL используемой вами библиотеки SOAP.

0 голосов
/ 20 октября 2010

Пожалуйста, проверьте мой ответ на другой вопрос здесь . .net требует, чтобы действие мыла имело предварительно добавленное пространство имен.

...