gpt4 book ai didi

php - 如何构造复杂的嵌套 SOAP 参数

转载 作者:可可西里 更新时间:2023-11-01 13:26:22 25 4
gpt4 key购买 nike

好吧,这个问题让我难以自拔。我尝试使用 PHP 和 SOAP 连接到 Web 服务时未成功。我不知道出了什么问题,而且这是一项全新的服务,他们的“文档”很差。所以我不知道问题是否真的出在他们头上,但我没有足够的 SOAP 经验来确定这一点。我祈祷有人能帮助我。

我已经能够通过将 XML 直接放入 SOAP UI 来连接到该服务,但是每当我尝试使用 SoapClient 时它就会崩溃。我要发送的 XML 结构看起来像

<Envelope xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://a.uri" xmlns:ns3="http://tempuri.org/">
<Body>
<GetAuthorization>
<ns1:registrationObj ns1:type="ns2:RegistrationAuthorization">
<ns2:Company>####</ns2:Company>
<ns2:Computer>####</ns2:Computer>
<ns2:Facility>####</ns2:Facility>
</ns1:registrationObj>
</GetAuthorization>
</Body>
</Envelope>

我尝试过的方法太多了,无法一一列举。使用 __soapCall、$client->method()、SoapVar 和 SoapParam。总的来说,我发现 PHP 的 SoapClient 的文档有点稀疏。但我什至无法获得与我想要的匹配的调用结构(通过 __getLastRequest() 转储)

我注意到的一件事是客户端不断删除我的数组的第一个元素(在我尝试将参数作为普通数组传递的那些实例上。所以:

$params = array("Company" => "abc",
"Computer" => "def",
"Facility" => "ghi");
$result = $soap_client->__soapCall('GetAuthorization',$params);

返回

<env:Body>
<ns1:GetAuthorization/>
<param1>def</param1>
<param2>ghi</param2>
</env:Body>

请注意在这种情况下 GetAuthorization 如何自行关闭并丢弃第一个数组元素。我也分别经历过这两种情况(值得注意的是,我也已经正确命名了参数。我经历了太多次迭代,我不记得是什么尝试产生了哪些结果。尽管如此,SOAP 的表现并不像我希望如此。它无法正确封装数据和/或丢弃随机元素。

$parameters = 
array("ra" => new SoapVar(array(
"CompanyId" => new SoapVar("####", SOAP_ENC_OBJECT, 'guid', 'http://schemas.microsoft.com/2003/10/Serialization/', 'CompanyId', 'http://schemas.datacontract.org/x/y/z.xx'),
"ComputerId" => new SoapVar("{####}", SOAP_ENC_OBJECT, 'string', 'http://www.w3.org/2001/XMLSchema', 'ComputerId', 'http://schemas.datacontract.org/x/y/z.xx'),
"FacilityId" => new SoapVar("####", SOAP_ENC_OBJECT, 'guid', 'http://schemas.microsoft.com/2003/10/Serialization/', 'FacilityId', 'http://schemas.datacontract.org/x/y/z.xx')
), SOAP_ENC_OBJECT, 'RegistrationAuthorization', 'http://schemas.datacontract.org/x/y/z.xx', 'ra', "http://schemas.datacontract.org/x/y/z.xx"

)));

$result = $auth_client->GetAuthorization($parameters);

是我最初试图插入的结构(在我简化它以试图找出问题所在之前),我想因为我需要对参数的命名空间进行如此多的控制,所以我需要这样做。但是,这只是使用自封闭元素发出请求。

有人能告诉我如何构造调用以产生适当的 XML 结构吗?这可能是在服务端,而 WSDL 有问题吗? (我不确定 WSDL 在后端负责什么。)

对于这个问题的含糊不清,我深表歉意,但我感到很迷茫,我什至不确定该问哪个问题。 :-(

最佳答案

它应该可以工作:

<?php
$client = new \SoapClient(null, array(
'uri' => 'http://localhost/stack/21150482/',
'location' => 'http://localhost/stack/21150482/server.php',
'trace' => true
));
try {

$company = new \SoapVar('XXXXX', XSD_STRING, null, null, 'Company', 'http://a.uri');
$computer = new \SoapVar('XXXXX', XSD_STRING, null, null, 'Computer', 'http://a.uri');
$facility = new \SoapVar('XXXXX', XSD_STRING, null, null, 'Facility', 'http://a.uri');

$registrationObj = new \SoapVar(
array($company,$computer,$facility),
SOAP_ENC_OBJECT,
'RegistrationAuthorization',
'http://a.uri',
'registrationObj',
'http://www.w3.org/2001/XMLSchema-instance'
);

$client->GetAuthorization($registrationObj);

} catch (\Exception $e) {
var_dump($e->getMessage());
}

$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($client->__getLastRequest());

print '<pre>';
print htmlspecialchars($dom->saveXML());

我的结果是:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/stack/21150482/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://a.uri" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:GetAuthorization>
<xsi:registrationObj xsi:type="ns2:RegistrationAuthorization">
<ns2:Company xsi:type="xsd:string">XXXXX</ns2:Company>
<ns2:Computer xsi:type="xsd:string">XXXXX</ns2:Computer>
<ns2:Facility xsi:type="xsd:string">XXXXX</ns2:Facility>
</xsi:registrationObj>
</ns1:GetAuthorization>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

关于php - 如何构造复杂的嵌套 SOAP 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21150482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com