2011-03-08 56 views
3

所以我试图做通过XML SOAP的API调用后,我得到的错误是:“未将对象引用设置到对象的实例”XML SOAP POST错误,我在做什么错误?

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) 

中的授权作品,我已经做了succesfull使用此代码调用,现在唯一不同的是XML SOAP POST数据。我会尝试泡沫。

没有回溯只有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>

响应:

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

任何想法?

乔治

+1

不,根本没有想法。不过,如果您发布了您正在使用的代码以及所获得的回溯,我可能会有一些。 – 2011-03-08 01:35:37

+0

你确定你使用python而不是.NET? – 2011-03-08 01:35:52

+0

您是否正在手动构建SOAP POST正文?使用[python-suds](http://pypi.python.org/pypi/suds)可以更轻松地调用您的SOAP服务。 – samplebias 2011-03-08 02:10:22

回答

6

Autotask在IIS 6上有一个古老的API ......为了处理微软的crapstack,你必须将你在那里推送的XML转义为CDATA。这里是为我工作作为SOAP体中,

<ins0:query> 

标签内:

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

我放弃了python/AT,并在.net的论坛上找到了一个库,它为我所需要的工作。如果我回到AT API,我会再试一次,谢谢。 – George 2011-10-12 02:12:45

+1

对不起,你必须.net它。也许在未来10年,他们将拥有一个不错的REST API ......和电灯...... – Eskim0 2011-10-14 06:48:56

2

乔治,这里是调用的测试网络的服务之一,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> 

您应该能够通过传递上的用户名和 密码做HTTP基本身份验证构造函数:

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

祝你好运泡沫!

+0

不行,我知道标题不是问题。这是darn XML。我使用相同的头文件对此API进行了其他调用。呃,我卡住了,我在他们的网站上询问确认我的XML,会看到会发生什么。 – George 2011-03-09 03:22:47

+0

他们无法弄清楚,所以我重写了它到VB.net,但现在得到一个NRE,即使我直接从API PDF复制它。 – George 2011-04-17 14:28:57

0

以上,表明他们的API是“过时”的回复是轻描淡写的一点点。这就是说,你遇到的问题是因为你的XML格式不正确。

除了正确格式化的XML正文以外,没有什么可以期待的,也不需要你。

爱斯基摩0手为你工作的一个身体,但问题是,你可能不知道他实际上做了什么。他正在更大的SOAP请求中创建一个“sXML”主体。

大多数库(perl,python和php都可以做到这一点)提供了一种方法,你可以传入一些queryxml和“sXML”ify它。这是你不应该亲手做的事情,因为有太多细节需要跟踪。

因此,例如,在Perl中你可以这样做:

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

这将发出字符串$查询的sXML版本的SOAP端点的查询方法。