alpari / soap-client
具有额外功能的 SOAP 客户端
Requires (Dev)
- mikey179/vfsstream: ^1.6
- phpunit/phpunit: ~7
- symfony/browser-kit: ^4.1
- symfony/http-kernel: ^4.2
- symfony/process: ^4.2
- zendframework/zend-soap: ^2.7
This package is auto-updated.
Last update: 2024-09-14 01:09:37 UTC
README
带有额外功能的扩展 PHP soap 客户端。
特性
- 请求超时支持
- 异步 SOAP 请求
- 自定义 HTTP-请求头
- 带有 PSR-3 兼容日志记录器的日志支持
- 专门的测试客户端,用于在您的服务器上编写测试
先决条件
为了使用此库,服务器上必须预先安装 soap
、dom
、curl
、libxml
扩展。
安装
推荐的方式是使用 composer
$ composer require alpari/soap-client:~1.0 --prefer-dist|--prefer-source
用法
简单的 SOAP 请求
use Alpari\Components\SoapClient\Client\SoapClient; $client = new SoapClient('http://example.com/service?wsdl'); $result = $client->targetServiceMethod(1, 2);
异步 SOAP 请求
此功能可以并行执行多个 SOAP 请求。
use Alpari\Components\SoapClient\Client\SoapClient; $client = new SoapClient('http://example.com/service?wsdl'); $responses = $client->async(function (SoapClient $client) { $client->methodA(25); $client->methodB(64); });
responses 变量将包含在 async
函数内部按顺序调用的所有调用的结果。在上面的示例中,responses[0] 是远程方法 methodA
的返回值,response[1] 是 methodB
的返回值。如果在某些方法调用期间发生异常,则相应的数组项将包含 SoapFault
类的异常对象。
带超时的请求
要设置请求超时,请使用 setTimeout
值,并传递单个参数 - 等待请求完成的毫秒数。如果没有显式调用 setTimeout
方法,则将使用 php-ini 设置 default_socket_timeout
的值。
$client = new SoapClient('http://example.com/service?wsdl'); $client->setTimeout(60000); // in milli-seconds $result = $client->targetServiceMethod(1, 2);
传递自定义 HTTP 头
$client = new SoapClient('http://example.com/service?wsdl'); $client->setHeader('X-Header-Name', 'A value'); $result = $client->targetServiceMethod(1, 2);
记录请求
SoapClient
实现了 Psr\Log\LoggerAwareInterface
。
use Psr\Log\NullLogger; $client = new SoapClient('http://example.com/service?wsdl'); $client->setLogger(new NullLogger()); $result = $client->targetServiceMethod(1, 2);
SOAP 客户端构造函数选项
此 SOAP 客户端的实现支持额外的选项数组
local_cert
- 用于 SSL 连接的客户端证书文件名。local_key
- 客户端证书的私钥。passphrase
- 证书私钥的密码。ca_bundle
- 用于验证服务器证书的可信 CA 文件名。如果没有提供,则使用系统提供的文件。curl
- 包含额外 curl 选项的数组。有关所有可能的选项,请参阅这里。cache_prefix
- 生成的 wsdl 缓存文件名的文件名前缀
测试自己的 SOAP 服务器
要测试自己的 SOAP 服务器,您需要安装额外的包,如果您在项目中还没有安装它们
composer require --dev symfony/http-kernel symfony/browser-kit
如果项目基于 Symfony 框架,只需在测试用例中使用 Alpari\Components\SoapClient\Test\TestSoapClient
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Alpari\Components\SoapClient\Test\TestSoapClient; class SoapServiceTest extends WebTestCase { public function testSoapServiceMethod() { $httpClient = static::createClient(); $soapClient = new TestSoapClient($soapClient, 'wsdl url'); $result = $soapClient->SoapServiceMethod('Method args'); self::assertEquals(200, $httpClient->getResponse()->getStatusCode()); self::assertEquals('something', $result); } }
如果项目基于其他框架,您需要在测试中使用 Symfony\Component\HttpKernel\HttpKernelInterface
的实现,这将重定向所有调用到应用程序的入口点,并返回 symfony Response
对象
use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Alpari\Components\SoapClient\Test\TestSoapClient; use Symfony\Component\HttpKernel\Client; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\HttpFoundation\Response; class SoapServiceTest extends TestCase { public function testSoapServiceMethod() { $httpClient = new Client(new class implements HttpKernelInterface { public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true) { return new Response( // rendered content from application front controller ); } }); $soapClient = new TestSoapClient($soapClient, 'wsdl url'); $result = $soapClient->SoapServiceMethod('Method args'); self::assertEquals(200, $httpClient->getResponse()->getStatusCode()); self::assertEquals('something', $result); } }
运行测试
测试是用 phpunit 编写的。要运行测试,请使用以下命令
vendor/bin/phpunit -c phpunit.xml.dist
许可
本项目采用 MIT 许可证 - 有关详细信息,请参阅LICENSE 文件