PHP SOAPClient 相当于 CURLOPT_FOLLOWLOCATION?

PHP SOAPClient equivalent of CURLOPT_FOLLOWLOCATION?

我能够创建原始 XML 并使用 CURLOPT_FOLLOWLOCATION 设置为 true 的 curl 与服务器通信。按照服务商的说法,307重定向是规则,主机可以随时更改。

该项目的 XML 庞大而冗长。我不想使用原始 XML;我想使用 SOAPClient。

此 SOAPClient 代码导致 SoapFault "message":protected]=> string(25) "Could not connect to host"

$url = "https://vmi21.example.net/VMIService.asmx";
$options = [ 'trace' => 1 ];

$soapClient = new SOAPClient($url . '?wsdl', $options );

try
{
    $result = $soapClient->GetCompanyList( $params );
}
catch (SoapFault $soapFault)
{
    var_dump($soapFault);
}

经过多次调试后,我注意到跟踪中有一个 URL:

...
[1]=> string(41) "https://vmi8.example.net/VMIService.asmx"
...

假设这是 307 重定向 curl 的地方,我在 SOAPClient 选项中设置了以下内容,它起作用了!

[ 'location' => 'https://vmi8.example.net/VMIService.asmx' ] 

如上所述,根据服务提供商的说法,这些主机可以随时更改,这意味着此代码可能会经常中断。

有什么方法可以告诉 SOAPClient 遵循这些重定向,就像 curl 在 CURLOPT_FOLLOWLOCATION 选项设置为 true 时所做的那样?

它应该默认遵循重定向,由于重定向失败,您不太可能看到该消息。

但是,如果您确实需要专门更改重定向行为,只需为连接创建一个上下文:

<?php
$ctx = stream_context_create(["http" => ["follow_location" => 1]]);
$options = ["trace" => 1, "stream_context" => $ctx];
$soapClient = new SOAPClient("$url?wsdl", $options);

很可能存在防火墙问题或他们的响应存在某种问题,这就是导致此问题的原因。如果如您所建议的那样,它与 cURL 一起使用,也许一个好的策略可能是使用 cURL 或 file_get_contents,禁用重定向,获取 Location header 的内容并将其提供给 SoapClient 构造函数?