php实现soap
PHP 实现 SOAP 的方法
创建 SOAP 客户端
通过 SoapClient 类可以快速创建一个 SOAP 客户端,用于调用远程 SOAP 服务。以下是一个基本示例:
$wsdl = "http://example.com/soap/service?wsdl";
$options = [
'trace' => 1, // 启用调试跟踪
'exceptions' => true, // 抛出异常
];
try {
$client = new SoapClient($wsdl, $options);
$result = $client->someMethod($params); // 调用远程方法
print_r($result);
} catch (SoapFault $e) {
echo "SOAP 错误: " . $e->getMessage();
}
调用 SOAP 方法
在创建客户端后,可以直接调用 WSDL 中定义的方法。方法名和参数需与服务端保持一致。
$params = [
'param1' => 'value1',
'param2' => 'value2',
];
$response = $client->__soapCall('methodName', [$params]);
调试 SOAP 请求和响应
启用 trace 选项后,可以通过以下方法获取请求和响应的原始数据:
echo "请求数据:\n" . $client->__getLastRequest() . "\n";
echo "响应数据:\n" . $client->__getLastResponse() . "\n";
创建 SOAP 服务端
使用 SoapServer 类可以创建一个 SOAP 服务端。以下是一个简单的服务端实现:
// 定义服务端类
class MySoapService {
public function hello($name) {
return "Hello, " . $name;
}
}
// 创建 SOAP 服务端
$wsdl = "service.wsdl"; // WSDL 文件路径
$server = new SoapServer($wsdl);
$server->setClass('MySoapService');
$server->handle(); // 处理请求
生成 WSDL 文件
服务端需要提供 WSDL 文件描述服务。可以使用工具或手动编写 WSDL。以下是手动编写的简单示例:
<definitions name="MySoapService"
targetNamespace="urn:MySoapService"
xmlns:tns="urn:MySoapService"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="helloRequest">
<part name="name" type="xsd:string"/>
</message>
<message name="helloResponse">
<part name="greeting" type="xsd:string"/>
</message>
<portType name="MySoapServicePort">
<operation name="hello">
<input message="tns:helloRequest"/>
<output message="tns:helloResponse"/>
</operation>
</portType>
<binding name="MySoapServiceBinding" type="tns:MySoapServicePort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="hello">
<soap:operation soapAction="urn:MySoapService#hello"/>
<input>
<soap:body use="encoded" namespace="urn:MySoapService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:MySoapService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="MySoapService">
<port name="MySoapServicePort" binding="tns:MySoapServiceBinding">
<soap:address location="http://example.com/soap/server.php"/>
</port>
</service>
</definitions>
处理 SOAP 头信息
如果需要处理 SOAP 头信息,可以通过以下方式:
// 客户端添加头信息
$header = new SoapHeader('namespace', 'headerName', 'headerValue');
$client->__setSoapHeaders($header);
// 服务端读取头信息
$headers = $server->getSoapHeaders();
注意事项
- 确保 PHP 已启用 SOAP 扩展(
extension=soap在php.ini中)。 - 对于复杂数据类型,需在 WSDL 中正确定义 XML Schema。
- 使用 HTTPS 协议确保通信安全。
- 考虑使用缓存机制(如
WSDL_CACHE_DISK)提升性能。







