php - 如何在 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
解决方案
首先你应该知道你的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;
}
}
你必须为你的GetAvailibity
webservice 结构做同样的事情。
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);
就这样。请记住,这只是一个示例。
推荐阅读
- python - 返回作为参数给出的闰年列表的 True/False bool 值列表
- google-sheets - 使用条件将多个工作表导入一张
- spring-webflux - 通过映射到新的返回值来处理 Reactor 错误而不删除任何元素
- nuxt.js - 如何在 Nuxt 的站点地图中包含完整的动态路线
- php - 如何在我的评论打印系统中添加准备语句
- azure - 无法运行 Azure 表单识别器布局_遇到意外的元素引用
- java - 使用 Azure Key Vault 中的证书进行 MTL 通信
- lua - 杀死NPC时如何得分
- django - AUTH_USER_MODEL 指的是尚未安装的模型“users.CustomUser”
- mysql - 为 Mysql 存储过程使用 Controller Laravel 8 变量值