alpari/soap-client

具有额外功能的 SOAP 客户端

v1.0.0 2018-12-13 10:14 UTC

This package is auto-updated.

Last update: 2024-09-14 01:09:37 UTC


README

带有额外功能的扩展 PHP soap 客户端。

特性

  1. 请求超时支持
  2. 异步 SOAP 请求
  3. 自定义 HTTP-请求头
  4. 带有 PSR-3 兼容日志记录器的日志支持
  5. 专门的测试客户端,用于在您的服务器上编写测试

先决条件

为了使用此库,服务器上必须预先安装 soapdomcurllibxml 扩展。

安装

推荐的方式是使用 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 文件