【问题标题】:XML SOAP POST error, what am I doing wrong?XML SOAP POST 错误,我做错了什么?
【发布时间】:2011-03-08 01:29:35
【问题描述】:

所以我尝试通过 XML SOAP POST 进行 API 调用,我得到的错误是:“对象引用未设置为对象的实例”

site = 'https://webservices.autotask.net/atservices/1.5/atws.asmx'
data = """<?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>
    <queryxml>
      <entity>contact</entity>
        <query>
          <field>firstname<expression op="equals">George</expression>
          </field>
        </query>
    </queryxml>
  </soap:Body>
</soap:Envelope>"""

headers = {
    'Content-Type': 'application/soap+xml; charset=utf-8',
    'Host': 'webservices.autotask.net',
    'Content-Type': 'text/xml; charset=utf-8',
    'Content-Length': len(data),
    'SOAPAction': "http://autotask.net/ATWS/v1_5/query"
    } 
site = 'https://webservices.autotask.net/atservices/1.5/atws.asmx'
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='webservices.autotask.net',
                          uri=site,
                          user='user,
                          passwd='pw')
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
page = urllib2.urlopen(site)
print(data)
req = urllib2.Request(site, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
print(the_page)

身份验证有效,我已使用此代码成功调用,现在唯一不同的是数据 XML SOAP POST。我会试试泡沫。

No Traceback only web 服务器错误:

打印出我发送的 XML SOAP POST:

<?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> <queryxml> <entity>contact</entity> <query> <field>firstname<expression op="equals">George</expression> </field> </query> </queryxml> </soap:Body> </soap:Envelope>

回复:

&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;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"&gt;&lt;soap:Body&gt;&lt;queryResponse xmlns="http://autotask.net/ATWS/v1_5/"&gt;&lt;queryResult&gt;&lt;ReturnCode&gt;-1&lt;/ReturnCode&gt;&lt;EntityResults /&gt;&lt;EntityResultType /&gt;&lt;Errors&gt;&lt;ATWSError&gt;&lt;Message&gt;Object reference not set to an instance of an object.&lt;/Message&gt;&lt;/ATWSError&gt;&lt;ATWSError&gt;&lt;Message&gt;Error reading in Query XML.&lt;/Message&gt;&lt;/ATWSError&gt;&lt;/Errors&gt;&lt;EntityReturnInfoResults /&gt;&lt;/queryResult&gt;&lt;/queryResponse&gt;&lt;/soap:Body&gt;&lt;/soap:Envelope&gt;

有什么想法吗?

乔治

【问题讨论】:

  • 不,完全没有想法。不过,如果您发布了您正在使用的代码以及您获得的回溯,我可能会有一些。
  • 您确定您使用的是 python 而不是 .NET?
  • 您是否手动构建 SOAP POST 主体?使用python-suds 可以更轻松地调用您的SOAP 服务。
  • @Brian 是 python,但是服务器需要 SOAP 1.1 和 1.2
  • @Daniel No Traceback only web server error.

标签: python xml soap post


【解决方案1】:

Autotask 在 IIS 6 上有一个古老的 API... 来处理 Microsoft crapstack,您必须将作为 CDATA 推送到那里的 XML 转义。这是对我有用的肥皂体,在

<ins0:query> 

标签:

<ins0:sXML>
<![CDATA[<queryxml>
<entity>contact</entity>
<query>
<field>phone<expression op='equals'>#{phone}</expression></field>
</query>
</queryxml>]]>
</ins0:sXML>

【讨论】:

  • 我放弃了 python/AT 并在他们的 .net 论坛上找到了一个库,它可以满足我的需要。如果我回到 AT api,我会再试一次,谢谢。
  • 抱歉,您必须使用 .net 进行处理。也许再过 10 年,他们将拥有一个不错的 REST API……和电灯……
  • @Eskim0 我们还要再等 2 年:/ 还没有其他 API
【解决方案2】:

George,这是一个在webservicex.net 上调用测试网络服务之一的示例:

import suds
url = 'http://www.webservicex.net/stockquote.asmx?WSDL'
client = suds.client.Client(url=url)
print client.service.GetQuote('IBM')

<StockQuotes>
  <Stock>
     <Symbol>IBM</Symbol>
     <Last>159.93</Last><Date>3/7/2011</Date><Time>4:00pm</Time>
     <Change>-1.90</Change><Open>161.60</Open><High>162.98</High>
     <Low>158.85</Low><Volume>5318064</Volume>
     <MktCap>195.0B</MktCap><PreviousClose>161.83</PreviousClose>
     <PercentageChange>-1.17%</PercentageChange>
     <AnnRange>116.00 - 166.25</AnnRange>
     <Earns>11.52</Earns><P-E>14.05</P-E>
     <Name>International Bus</Name>
  </Stock>
</StockQuotes>

您应该能够通过传入用户名和 构造函数上的密码:

client = suds.client.Client(url=url, username='user', password='pw')

祝你好运!

【讨论】:

  • 不行,我知道标题不是问题。这是该死的 XML。我已经使用相同的标头对该 API 进行了其他调用。呃,我被卡住了,我在他们的网站上要求确认我的 XML,看看会发生什么。
  • 他们也想不通,所以我将它重写到 VB.net 中,但现在得到了一个 NRE,即使我直接从 API PDF 中复制了它。
【解决方案3】:

上面的回复表明他们的 API “过时”有点轻描淡写。话虽如此,您遇到的问题是因为您的 XML 格式不正确。

除了格式正确的 XML 正文之外,他们对您的期望和需要没有什么疯狂的。

Eskim0 为你手工制作了一个身体,但问题是你可能看不到他实际做了什么。他正在更大的 SOAP 请求中制作“sXML”主体。

大多数库(perl、python 和 php 都可以做到这一点)提供了一种方法,您可以通过该方法传入一些 queryxml 并“sXML”对其进行“化”。这是您真正不应该尝试手动完成的事情,因为要跟踪的细节太多了。

例如,在 perl 中你会这样做:

$soap->query(SOAP::Data->value($query)->name('sXML'))

这将向soap端点的查询方法发出一个sXML版本的字符串$query。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-24
    • 2013-11-25
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多