2013-01-08 52 views
0

我遇到了allposters.com SOAP(http://webservice.allposters.com/)的問題。我試圖在PHP 5.3安裝中通過(稍作修改)的nuSOAP PHP庫(http://sourceforge.net/projects/nusoap/)獲取一些產品信息。AllPosters.com SOAP有問題的響應

我的要求是(所有的人物都完全一樣在這裏,他們不會轉換爲實體):

POST /ProductInformationService.asmx HTTP/1.0 
Host: webservice.allposters.com 
User-Agent: NuSOAP/0.9.5 (1.123) 
Content-Type: text/xml; charset=UTF-8 
SOAPAction: "http://Webservice.Allposters.com/APCF.AffiliateWebService/ProductInformationService/GetProductByProductNumberInformation" 
Content-Length: 570 

<?xml version="1.0" encoding="UTF-8" ?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <GetProductByProductNumberInformation xmlns="http://Webservice.Allposters.com/APCF.AffiliateWebService/ProductInformationService"> 
      <APCSearchXml> 
       <WebSiteID>1234567890</WebSiteID> 
       <SearchTerm>1234567</SearchTerm> 
       <LanguageID>1</LanguageID> 
       <CurrencyCode>USD</CurrencyCode> 
      </APCSearchXml> 
     </GetProductByProductNumberInformation> 
    </soap:Body> 
</soap:Envelope> 

而我得到的錯誤

Length cannot be less than zero. Parameter name: length 

在這個特定的響應

HTTP/1.1 200 OK 
Connection: keep-alive 
Date: Tue, 08 Jan 2013 18:46:59 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 4.0.30319 
Cache-Control: private, max-age=0 
Content-Type: text/xml; charset=utf-8 
Content-Length: 821 

<APC_Search_Results> 
    <StatusCode>1</StatusCode> 
    <Search_Error> 
     <ErrorNumber>1</ErrorNumber> 
     <ErrorDescription>Length cannot be less than zero. Parameter name: length</ErrorDescription> 
    </Search_Error> 
</APC_Search_Results> 

通信似乎工作正常;如果我從我以前的要求刪除「WebSiteID」元素,我會得到

Index was out of range. Must be non-negative and less than the size of the collection. 

可惜的是,從我在網上找到了幾個例子,並從7頁在其網站上記錄在Visual Basic樣本(這是我能找到的唯一文檔),我真的無法弄清楚我錯過了什麼,而.NET錯誤並沒有告訴我可以使用的東西。

有人遇到allposters.com會員web服務類似的問題,並有一些建議?

+1

你在哪裏發送'length'參數?如果你不是,你應該嗎? – Madbreaks

+0

聽起來像你需要傳遞一個長度參數 –

+0

謝謝你的建議,但是「長度不能小於零。參數名稱:長度」不是由於我的請求中缺少「length」參數造成的已經嘗試添加它),但是當我的請求被處理時,它們看起來像來自它們服務器的ASP錯誤,可能是字符串減法操作或其他東西,其中長度參數變爲負數。根據我的請求,我無法弄清楚在他們的服務器上觸發了這個問題,因爲文檔很差。 – Corneliu

回答

2

您正在以錯誤的方式使用Soap服務。

如果您查看http://webservice.allposters.com/ProductInformationService.asmx?op=GetProductByProductNumberInformation上的「GetProductByProductNumberInformation」調用頁面上的示例,只提到了一個佔位符「字符串」,但是您要發送一組完整的XML。這可能是錯誤的。

我不知道你爲什麼認爲你可以發送比你所做的XML更多的字符串,但是我發現這個服務實際上期望你發送你的XML包裝在CDATA中,這樣它就是一個字符串 - 服務器然後解壓縮字符串並執行另一個XML解析。

該實現方法完全是廢話,因爲它規避了使用WSDL描述服務允許和期望的參數類型的Soap服務 - 但您最不可能改變這一點。

所以你必須讓NuSoap將你的XML字符串包裝在CDATA標籤中,否則它根本無法工作。

+0

謝謝,那是解決方案。 – Corneliu

+0

@Corneliu - 可能值得將這個問題的鏈接發送給allposters.com,他們可以考慮到他們的下一個API實現嗎? – halfer

0

的OP提出的問題,編輯下面的解決方案,所以我換了一個正確的答案:

<?xml version="1.0" encoding="UTF-8" ?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <GetProductByProductNumberInformation xmlns="http://Webservice.Allposters.com/APCF.AffiliateWebService/ProductInformationService"> 
      <APCSearchXml> 
       <![CDATA[ 
        <APC_Search_Query> 
         <WebSiteID>1234567890</WebSiteID>       
          <SearchText>123456</SearchText> 
         <LanguageID>1</LanguageID> 
         <CurrencyCode>USD</CurrencyCode> 
        </APC_Search_Query> 
       ]]> 
      </APCSearchXml> 
     </GetProductByProductNumberInformation> 
    </soap:Body> 
</soap:Envelope>