如何在php上做SoapClient

时间:2010-04-08 05:13:31

标签: php soap

我是soapclient的新手,我曾尝试在网上做一些研究并尝试用肥皂编码,但似乎这对我来说仍然不起作用,只是在这里徘徊任何人都可以指出并可能给我一些例子怎么能我实际上使用soapclint从以下Web服务器获取反馈?

POST /webservices/tempconvert.asmx HTTP/1.1
Host: www.w3schools.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/CelsiusToFahrenheit"

<?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>
    <CelsiusToFahrenheit xmlns="http://tempuri.org/">
      <Celsius>string</Celsius>
    </CelsiusToFahrenheit>
  </soap:Body>
</soap:Envelope>

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?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>
    <CelsiusToFahrenheitResponse xmlns="http://tempuri.org/">
      <CelsiusToFahrenheitResult>string</CelsiusToFahrenheitResult>
    </CelsiusToFahrenheitResponse>
  </soap:Body>
</soap:Envelope>



<?php
$url = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";
$client = new SoapClient($url);


?>

我应该为接下来的步骤做些什么才能得到回应?

1 个答案:

答案 0 :(得分:12)

您首先必须实现SoapClient,就像您一样:

$url = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";
$client = new SoapClient($url);


然后,您必须调用您要使用的方法 - 可以在WSDL中找到方法名称。

例如,我们可以在此WebService中调用名为CelsiusToFahrenheit 的方法:

$result = $client->CelsiusToFahrenheit( /* PARAMETERS HERE */ );


现在,问题是要知道应该传递哪些参数;以及如何...

如果你看一下WSDL,你会看到这一部分:

<s:element name="CelsiusToFahrenheit">
  <s:complexType>
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="Celsius" type="s:string" />
    </s:sequence>
  </s:complexType>
</s:element>

这表明此方法应该传递一个数组,其中包含1个项目,该项目具有“Celsius”作为键,以及要转换为值的值。

这意味着您必须使用这部分PHP代码:

$result = $client->CelsiusToFahrenheit(array('Celsius' => '10'));


执行此调用,并转储结果:

var_dump($result);

获取此类输出:

object(stdClass)#2 (1) {
  ["CelsiusToFahrenheitResult"]=>
  string(2) "50"
}


这意味着你必须使用它:

echo $result->CelsiusToFahrenheitResult . "\n";

获取结果值

50


注意:此结果的结构当然也可以在WSDL文件中找到 - 请参阅 CelsiusToFahrenheitResponse 部分。