2011-03-08 32 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端點的查詢方法。