gpt4 book ai didi

PHP:如何保留 SOAP 响应的结构?

转载 作者:行者123 更新时间:2023-12-02 05:08:51 24 4
gpt4 key购买 nike

我有一个关于 PHP 中的 SOAP 调用的问题。有一个名为“DoBulkOperation”的 web 服务,它获取任何内容的列表,执行某些操作,然后返回一个列表,其中包含有关它已完成的操作的信息。这里重要的是,请求的每个列表元素在相同索引的响应中都有其对应项。

我得到的响应是这样的:

<Body>
<DoBulkOperationResponse>
<items>
<OperationResponse>
<result>17</result>
</OperationResponse>
<Error>Some error occured</Error>
<OperationResponse>
<result>18</result>
</OperationResponse>
<OperationResponse>
<result>19</result>
</OperationResponse>
<OperationResponse>
<result>20</result>
</OperationResponse>
</items>
</DoBulkOperationResponse>
</Body>

即正确响应我的请求。现在,我可以说请求中的第二个列表元素有问题。

我从 PHP SoapClient 得到的不是我所期望的:

object(stdClass)#49 (1) {
["items"]=>
object(stdClass)#51 (2) {
["OperationResponse"]=>
array(4) {
[0]=>
object(stdClass)#53 (1) {
["customerID"]=>
int(17)
}
[1]=>
object(stdClass)#52 (1) {
["customerID"]=>
int(18)
}
[2]=>
object(stdClass)#50 (1) {
["customerID"]=>
int(19)
}
[3]=>
object(stdClass)#54 (1) {
["customerID"]=>
int(20)
}
}
["Error"]=>
string(17) "Some error occured"
}
}

元素的顺序完全被打乱了。现在,无法确定哪个请求元素导致哪个响应元素。

在 WSDL 中,“项目”被定义为序列。

有没有办法强制 SoapClient 实例保留响应的结构?

最好的问候,

马库斯

最佳答案

您在这里有几个选择,但要获得明确的答案,您应该提供此调用的 WSDL。

强制 PHP SoapClient 始终返回定义的数组。

设置或添加 array('features' => SOAP_SINGLE_ELEMENT_ARRAYS) 作为 SoapClient 的选项。它将防止结果仅在遇到多个元素时才具有数组。从我认为 PHP 的内部操作来看:在遇到第一个元素时,它只是被创建,在下一次遇到时,第一个元素被移动到一个数组中,然后添加第二个元素。

这可能已经解释了您所看到的结构,并且可能能够修复它。

将类映射与预定义预期结构的对象一起使用。

您必须找出 WSDL 中 ComplexType 结构的名称,然后才能创建用于这些结构的 PHP 类,而不是 stdClass。这对所有事情都非常有用,因为您的 IDE 可以为您提供自动完成功能,您可以通过使用 get_class() 实际查看您正在处理的元素。另一方面,您不能创建一个 PHP 对象来正确充当 XML 中的 items 结构,因此这可能只是装饰性的,但对于...

在您的自定义类中使用魔术 __set() 来干扰创建结果。

您可以创建一个自定义类,用作设置所有属性的 items。在魔术函数中,您可以尝试推送数据。至少您可以使用一些输出来调试它。

跟踪请求并直接访问 XML 结果。

在选项数组中设置选项 trace => true,并使用 SoapClient::__getLastResponse

为失败做好准备。

PHP 可能无法将您获得的 XML 结构转换为正确的结果。我会责怪你提供的 Soap API。人们通常会提议将某种 ID 附加到请求中,并在结果中重复使用此 ID,以使客户能够识别他们的东西。至少“按请求的顺序”返回的结构应该始终返回相同的项目并将结果携带在内部某处,例如:

<OperationResponse>
<result>17</result>
</OperationResponse>
<OperationResponse>
<Error>Some error occured</Error>
</OperationResponse>

关于PHP:如何保留 SOAP 响应的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15837111/

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