0

我对 allposters.com SOAP ( http://webservice.allposters.com/ ) 有疑问。我正在尝试在 PHP 5.3 安装上通过(稍作修改)nuSOAP PHP 库(http://sourceforge.net/projects/nusoap/)获取一些产品信息。

我的要求是(所有字符都和这里完全一样,它们没有转换为实体):

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 附属网络服务中遇到过类似的问题并有一些建议吗?

4

2 回答 2

2

您以错误的方式使用 Soap 服务。

如果您在http://webservice.allposters.com/ProductInformationService.asmx?op=GetProductByProductNumberInformation上查看呼叫“GetProductByProductNumberInformation”页面上的示例,则仅提及占位符“字符串”,但您发送的是完整的集合的 XML。这可能是错误的。

我不知道您为什么认为您可以发送的不仅仅是您所做的 XML 那样的字符串,但我发现该服务实际上希望您发送包装在 CDATA 中的 XML,以便它只是一个字符串 - 然后是服务器解压字符串并进行另一个 XML 解析。

这种实现方法完全是胡说八道,因为它绕过了使用 WSDL 描述服务允许和期望的参数类型的 Soap 服务这一点——但您不太可能改变它。

所以你必须让 NuSoap 将你的 XML 字符串包装在 CDATA 标记中,否则我认为它根本不起作用。

于 2013-01-08T20:32:21.800 回答
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>
于 2013-01-09T10:44:55.390 回答