cadoles/soap

构建和消费基于SOAP和WSDL的Web服务

5.2.1 2020-07-15 16:35 UTC

README

此分支提供了BeSimpleSoap捆绑包,已更新为与Symfony 3.4和4.x兼容(以及与PHP 7.0-7.4兼容)。

我们为了成功维护我们的某些项目,从官方BeSimpleSoap仓库进行了分支。

我们现在已整合了子分支中的更改和修复(感谢大家!),现在应该是最新的了 :)

此分支由Cadoles的人维护。

贡献

我们欢迎拉取请求 :) 如果可能,请包括测试。

运行测试可以通过运行php vendor/bin/phpunit来实现。

安装

如果您还没有composer,请按照Composer网站上的说明进行安装。

然后只需运行

$ composer require cadoles/soap

应该就足够了。

组件

BeSimpleSoap由五个组件组成...

BeSimpleSoapClient

重构 BeSimpleSoapClient是一个组件,它扩展了原生的PHP SoapClient,并增加了SwA和WS-Security等更多功能。

BeSimpleSoapServer

重构 BeSimpleSoapServer是一个组件,它扩展了原生的PHP SoapServer,并增加了SwA和WS-Security等更多功能。

BeSimpleSoapCommon

重构 BeSimpleSoapCommon组件包含服务器和客户端实现共享的功能。

BeSimpleSoapWsdl

未修改 该组件未受重构影响,应该可以正常工作。有关更多信息,请参阅原始的README

BeSimpleSoapBundle

不支持的! BeSimpleSoapBundle是一个用于构建基于WSDL和SOAP的Web服务的Symfony2捆绑包。有关更多信息,请参阅原始的README由于删除了Symfony库,并且未重构其他组件的使用,因此它将无法工作。请随意分支此存储库并修复它!

如何使用

您可以通过研究tests目录中的单元测试来获得一些提示。忘记关联数组、模糊配置、多个扩展和静默错误!这看起来可能有点复杂,但它将指导您正确配置和设置客户端或服务器。

SOAP客户端调用示例

$soapClientBuilder = new SoapClientBuilder();
$soapClient = $soapClientBuilder->build(
    SoapClientOptionsBuilder::createWithDefaults(),
    SoapOptionsBuilder::createWithDefaults('http://path/to/wsdlfile.wsdl')
);
$myRequest = new MyRequest();
$myRequest->attribute = 'string value';
$soapResponse = $soapClient->soapCall('myMethod', [$myRequest]);

var_dump($soapResponse); // Contains Response, Attachments

有什么问题吗?!

开启跟踪并捕获SoapFaultWithTracingData异常以获得一些糖果 :)

try {
    $soapResponse = $soapClient->soapCall('myMethod', [$myRequest]);
} catch (SoapFaultWithTracingData $fault) {
    var_dump($fault->getSoapResponseTracingData()->getLastRequest());
}

在此示例中,使用了MyRequest对象来描述请求。使用类映射,您帮助SoapClient将其转换为XML请求。

SOAP服务器处理示例

启动SOAP服务器稍微复杂一些。我建议您检查SoapServer单元测试以获取灵感。

$dummyService = new DummyService();
$classMap = new ClassMap();
foreach ($dummyService->getClassMap() as $type => $className) {
    $classMap->add($type, $className);
}
$soapServerBuilder = new SoapServerBuilder();
$soapServerOptions = SoapServerOptionsBuilder::createWithDefaults($dummyService);
$soapOptions = SoapOptionsBuilder::createWithClassMap($dummyService->getWsdlPath(), $classMap);
$soapServer = $soapServerBuilder->build($soapServerOptions, $soapOptions);

$request = $soapServer->createRequest(
    $dummyService->getEndpoint(),
    'DummyService.dummyServiceMethod',
    'text/xml;charset=UTF-8',
    '<received><soap><request><here /></request></soap></received>'
);
$response = $soapServer->handleRequest($request);

var_dump($response); // Contains Response, Attachments

在此示例中,使用了DummyService服务来处理请求。使用服务可以帮助您创建一致的SoapServer端点。服务可以持有端点URL、WSDL路径和类映射作为关联数组。您可以直接在DummyService中将类映射作为ClassMap对象持有,而不是数组。

在服务中,您应该描述从给定的WSDL中获取的SOAP方法。在示例中,调用了dummyServiceMethod。该方法将接收请求对象并根据类映射返回相应的响应对象。

查看dummyServiceMethod的简化实现以获得线索

/**
 * @param DummyServiceRequest $dummyServiceRequest
 * @return DummyServiceResponse
 */
public function dummyServiceMethod(DummyServiceRequest $dummyServiceRequest)
{
    $response = new DummyServiceResponse();
    $response->status = true;

    return $response;
}

有关更多信息以及获取实现灵感的示例,请参阅tests目录中的单元测试。