首页 > 解决方案 > 如何在 PHP 的 SOAP API 中调用和设置标头和函数中的参数?

问题描述

我只在 Rest API 上工作,我是 SOAP API 的新手,我正在集成在 SOAP API 上开发的第三方 API?

如何将其称为函数“GetAvailibility”以及标题并设置参数?

THIRD PARTY XML CODE:

<?xml version="1.0" encoding="utf-8"?>
 <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Header>
       <Authenticate xmlns="http://tempuri.org/">
         <InterfaceCode>10</InterfaceCode>
         <InterfaceAuthKey>jskjks</InterfaceAuthKey>
         <AgentCode>ggsjs2222</AgentCode>
         <Password>abcd</Password>
       </Authenticate>
    </soap:Header>
  <soap:Body>
     <GetAvailibility xmlns="http://tempuri.org/">
        <strRequestXML>string</strRequestXML>
     </GetAvailibility>
   </soap:Body>
  </soap:Envelop

标签: phpsoapsoapuisoap-clientsoapheader

解决方案


首先你应该知道你的soap webservice的功能和类型。有了这些知识,您就可以 有了这些知识,您可以让 SoapClient 完成所有工作,而只需调用具有相应类型的函数。

由于您还没有公布您的 Web 服务的功能和类型,我只举一个非常简单的例子。

功能和类型

正如我之前所说,您应该了解一下您的 Web 服务的功能和类型。为此,您可以启动soap 客户端对象并打印出所有函数和类型。

try {
    $wsdl = 'https://path/to/your/webservice.wsdl';
    $options = [
        'cache_wsdl' =>  WSDL_CACHE_NONE,
        'soap_version' => SOAP_1_2,
        'trace' => true,
    ];
    $client = new \SoapClient($wsdl, $options);

    // print out all functions
    echo "<pre>";
    var_dump($client->__getFunctions());
    echo "</pre>";

    // print out all types
    echo "<pre>";
    var_dump($client->__getTypes());
    echo "</pre>";
} catch (\SoapFault $fault) {
    // error handling
}

现在您可以编写代表所有类型 Web 服务的类。

结构体作为类

假设GetAvailability函数的类型如下所示。

GetAvailability(struct GetAvailabilty)

struct GetAvailability {
    string strRequestXML
}

Authenticate结构可能看起来像这样。

struct Authenticate {
    int InterfaceCode
    string InterfaceAuthKey
    string AgentCode
    string Password
}

请记住,这是一个猜测。我真的不知道你的类型在现实中的样子。这只是一个例子。您必须自己找出您的网络服务使用哪些类型和结构$client->__getTypes()。有了这些信息,您可以编写以下课程。

declare(strict_types=1);
namespace Application\Structs;

class Authenticate
{
    public $InterfaceCode;

    public $InterfaceAuthKey;

    public $AgentCode;

    public $Password;

    public function getInterfaceCode() : int
    {
        return $this->InterfaceCode;
    }

    public function setInterfaceCode(int $InterfaceCode) : Authenticate
    {
        $this->InterfaceCode = $InterfaceCode;
        return $this;
    }

    public function getInterfaceAuthKey() : string
    {
        return $this->InterfaceAuthKey();
    }

    public function setInterfaceAuthKey(string $InterfaceAuthKey) : Authenticate
    {
        $this->InterfaceAuthKey = $InterfaceAuthKey;
        return $this;
    }

    public function getAgentCode() : string
    {
        return $this->AgentCode;
    }

    public function setAgentCode(string $AgentCode) : Authenticate
    {
        $this->AgentCode = $AgentCode;
        return $this;
    }

    public function getPassword() : string
    {
        return $this->Password;
    }

    public function setPassword(string $Password) : Authenticate
    {
        $this->Password = $Password;
        return $this;
    }
}

你必须为你的GetAvailibitywebservice 结构做同样的事情。

declare(strict_types=1);
namespace Application\Structs;

class GetAvailability
{
    public $strRequestXML;

    public function getStrRequestXML() : string
    {
        return $this->strRequestXML;
    }

    public function setStrRequestXML(string $strRequestXML) : GetAvailability
    {
        $this->strRequestXML = $strRequestXML;
        return $this;
    }
}

现在您将 web 服务结构作为 php 类。这些类代表您之前使用该$client->__getTypes()方法列出的类型。php soap 客户端有另一个选项叫做classmap. classmap 选项可用于将某些 WSDL 类型映射到 PHP 类。此选项必须是一个数组,其中 WSDL 类型作为键,PHP 类的名称作为值。

还记得$options我们作为参数给soap客户端吗?只需展开 classmap 参数周围的选项。

$options = [
    'cache_wsdl' =>  WSDL_CACHE_NONE,
    'soap_version' => SOAP_1_2,
    'trace' => true,
    'classmap' => [
        'Authenticate' => 'Application\Structs\Authenticate',
        'GetAvailability' => 'Application\Structs\GetAvailability',
    ],
];

只需使用此选项启动您的肥皂客户端。

**标题和函数调用*

现在我们已经做好了所有准备工作,我们可以调用该函数了。

// set the soap header
$authenticateStruct = (new \Application\Structs\Authenticate())
    ->setInterfaceCode(10)
    ->setInterfaceAuthKey('jskjks')
    ->setAgentCode('ggsjs2222')
    ->setPassword('abcd');

$header = new \SoapHeader(
    'http://schemas.xmlsoap.org/soap/envelope/',
    'Authenticate',
    $authenticateStruct,
    false
);

$client->__setSoapHeaders($header);

// function call
$getAvailabilityStruct = (new \Application\Structs\GetAvailability())
    ->setStrRequestXML($strRequestXML);

$result = $client->GetAvailability($getAvailabilityStruct);

就这样。请记住,这只是一个示例。


推荐阅读