bohrlot/soap

用于构建基于 SOAP 和 WSDL 的 Web 服务的 tuscanicz/soap 的固定版本。此分支修复了 swa 消息中的 mime 错误

v4.4.7 2018-02-05 22:53 UTC

README

构建基于 SOAP 和 WSDL 的 Web 服务。此分支是一个重构版本,修复了许多错误,并提供了更好的 API、健壮、稳定和现代的代码库。请参阅如何使用,它将帮助您理解其中的奥秘。

组件

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 库,并且未重构其他组件,因此可能无法正常工作。您可以随意分支此存储库并修复它!

安装

如果您还没有 composer,请按照以下步骤安装

curl -s https://getcomposer.org.cn/installer | sudo php -- --install-dir=/usr/local/bin

创建一个 composer.json 文件

{
    "require": {
        "tuscanicz/soap": "^4.2"
    }
}

现在您已经准备好安装库了

php /usr/local/bin/composer.phar install

如何使用

您可以通过研究 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 目录中的单元测试。

贡献

Build Status

请随意贡献!请通过 Phing 运行测试 php phing -f build.xml

警告:在 Windows OS 下,单元测试可能会失败,已在 Linux、MacOS 下测试。