2011-09-08 118 views
1

我正在尝试使用PHP和SOAP创建UPS运费评估Web服务。 UPS为SOAP客户端提供了一个WSDL(我在下面粘贴的重要部分)。在PHP中使用SOAP发送XML请求

我的问题是,我该如何构建使用SOAP客户端发送的XML文档?我看到有关是否将我的请求格式化为PHP阵列或巨型字符串的冲突报告。一旦构建了这个文档,应该如何通过我在PHP中创建的SOAP客户端进行请求?

部分WSDL的:

<wsdl:binding name="FreightRateBinding" type="tns:FreightRatePortType"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="ProcessFreightRate"> 
      <soap:operation soapAction="http://onlinetools.ups.com/webservices/FreightRateBinding/v1.0" style="document"/> 
      <wsdl:input name="RateRequest"> 
       <soap:body parts="Body" use="literal"/> 
       <soap:header message="tns:RateRequestMessage" part="UPSSecurity" use="literal"> 
        <soap:headerfault message="tns:RateErrorMessage" part="RateError" use="literal"/> 
       </soap:header> 
      </wsdl:input> 
      <wsdl:output name="RateResponse"> 
       <soap:body parts="Body" use="literal"/> 
      </wsdl:output> 
      <wsdl:fault name="RateError"> 
       <soap:fault name="RateError" use="literal"/> 
      </wsdl:fault> 
     </wsdl:operation> 
    </wsdl:binding> 

我的XML文档的一部分,迄今:

<?xml version="1.0" ?> 
<FreightRateRequest> 
    <Request> 
     <RequestOption>1</RequestOption> 
    </Request> 
    <ShipFrom> 
     <Address> 
      <Name>Test</Name> 
      <AddressLine1>17 MacDade Blvd</AddressLine1> 
      <City>Collingdale</City> 
      <PostalCode>19023</PostalCode> 
      <CountryCode>US</CountryCode> 
      <Phone> 
       <Number>1-800-249-0011</Number> 
      </Phone> 
     </Address> 
    </ShipFrom> 
    <ShipperNumber>21W17V</ShipperNumber> 
    <ShipTo> 
     <Name>Test</Name> 
     <AddressLine1>14908 Sandy Lane</AddressLine1> 
     <City>San Jose</City> 
     <PostalCode>95124</PostalCode> 
     <CountryCode>US</CountryCode> 
    </ShipTo> 

PHP,到目前为止:

$mySOAP = new SoapClient("FreightRate.wsdl", $myOptionsArray); 

任何帮助将不胜感激。如果需要,我还会回复任何其他信息。

+0

你可以在你的wsdl上运行这个,并在这里发布关于ProcessFreightRate的部分? $ client = new SoapClient('http:// yourwsdl'); var_dump($ client - > __ getTypes()); – Charlie

+0

这只是返回XML模式?如果您愿意,我可以发布一部分内容,因为标记比var_dump()吐出的内容更清洁。 –

回答

2

XML是使用DOM操作产生的严重痛苦。你可以节省自己的只是把它当作一个巨大的字符串,并直接插入相关的值拉一吨的头发:只要你采取预防措施,以确保这两个变量的内容作出有效的XML

$xml = <<<EOL 
<?xml blah blah blah 
<root> 
    <tag>$some_value</tag> 
    <othertag>$different_value</othertag> 
</root> 
EOL; 

,这是迄今为止最简单的方法。这意味着将任何非XML接受的HTML字符实体(<>"'&)转换为其原始字符格式,并将这5个字符转换为实体等效形式。

+0

太好了。谢谢。另外,在我看到的使用SOAP发送的XML文档的示例中,XML元素的名称前面加上了“soap:”,并且有一个Header Section列出了关于该文档的一些信息。这些添加是否也是必要的?这是我使用SOAP的第一次体验,我很迷茫! –

+0

其实不知道。我从来没有用过肥皂 –