为什么 PHP Soap 调用可以在 Guzzle 中工作,但不能在 SoapClient 中工作?

问题描述 投票:0回答:1

使用以下 Guzzle 调用我得到了成功的响应:

$client = new Client();         
$body = '<?xml version="1.0" encoding="utf-8"?>             <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">             <soap:Body>                 <GetAuthenticationToken xmlns="http://tempuri.org/">                     <username>'. config('services.tmw.username') .'</username>                     <password>'. config('services.tmw.username') .'</password>                     <applicationName>testing</applicationName>                 </GetAuthenticationToken>             </soap:Body>             </soap:Envelope>         ';

$wsdl = '*** MASKED URL ***Service.svc';         
$res = $client->request('POST', $wsdl, [
    'headers' => ['Content-Type' => 'text/xml; charset=utf-8', 'SOAPAction' => 'http://tempuri.org/IDRTrackWebService/GetAuthenticationToken'],             
    'body' => $body]);         
$body = $res->getBody();         
dd($body->getContents());

庆幸的是,这可行,但使用 SoapClient 会简单得多。所以我这样做了:

$svcUrl = '---MASKED URL ---Service.svc';
$wsdl = '---MASKED URL ---Service.svc?wsdl';

        $client = new \SoapClient($wsdl, array('trace' => 1));
        $params = new \stdClass();
        $params->username = 'username';
        $params->password = 'password';
        $params->applicationName = 'testing';
    
        $result =  $client->__soapCall('GetAuthenticationToken', ['GetAuthenticationToken' => $params]);
        dd($result);

我已经使用和不使用 ?wsdl 进行了测试,并且得到了相同的响应:

SOAP-错误:解析 WSDL:无法从“---MASKED URL ---Service.svc?wsdl”加载:无法加载外部实体“---MASKED URL ---Service.svc?wsdl”

如果我访问没有 ?wsdl 的 url,它会向我显示说明,如果我访问带有 ?wsdl 的 url,它会向我显示完整的 xml。

我还验证了 wsdl:service => port =>soap:address 与 $svcUrl 相同。 最后,我在 SoapUI 中进行了呼叫设置和运行,效果也很好。

我失去了理智,因为这应该可行。有任何想法吗?短暂性脑缺血发作。

php soap
1个回答
0
投票

我认为你需要使用一个数组来传递参数,然后将该数组包装在另一个数组中进行调用。试试这个:

 $params = [
     'username' => 'username',
     'password' => 'password',
     'applicationName' => 'testing',
 ]
 $result =  $client->__soapCall('GetAuthenticationToken', [$params]);
 dd($result);

如果它有效,请现在告诉我们,因为我无法测试它,因为缺少“真实”网址。

© www.soinside.com 2019 - 2024. All rights reserved.