PHP SOAPClient是否等同于CURLOPT_FOLLOWLOCATION?

时间:2018-09-12 22:21:14

标签: php soap php-curl

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

此项目的XML庞大且冗长。我不想使用原始XML。我想使用SOAPClient。

此SOAPClient代码导致 SoapFault“ message”:protected] =>字符串(25)“无法连接到主机”

$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重定向卷曲的地方,我在SOAPClient选项中设置了以下内容,并且它起作用了!

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

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

是否可以通过将CURLOPT_FOLLOWLOCATION选项设置为true来告诉SOAPClient遵循curl那样的重定向?

1 个答案:

答案 0 :(得分:1)

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

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

<?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标头的内容并将其提供给SoapClient构造函数?