在PHP中创建Soap Auth请求

时间:2018-06-26 05:22:24

标签: php soap

我是SOAP的新手,正在尝试将其与PHP连接,但没有取得积极的结果。也许你可以帮我

SOAP 1.2请求

POST /XXXservice.asmx HTTP/1.1
Host: XXX.prueba.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetAcData xmlns="https://prueba.com/">
      <Userid>string</Userid>
      <Password>string</Password>
    </GetAcData>
  </soap12:Body>
</soap12:Envelope>

SOAP 1.2响应

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetAcDataResponse xmlns="https://prueba.com/">
      <XX>xml</GetAcDataResult>
    </GetAcDataResponse>
  </soap12:Body>
</soap12:Envelope>

我使用了以下代码,但我收到了此消息:

  

SOAP错误:解析WSDL:无法从'https://XXX.YYYY.com/XXXservice.asmx'加载:标记html第3行中的数据过早结束

<?php
    $options = array(
            'Userid' => 'xx',
            'Password' => 'xx',
        );

        $client = new SoapClient("https://XXX.YYYY.com/XXXservice.asmx", $options);
        $result = $client('GetAcData');

?>

1 个答案:

答案 0 :(得分:0)

首先,您需要Web服务的端点URL,该URL为您提供wsdl内容。如@camelsWrittenInCamelCase在其评论中所写,您应该尝试使用https://XXX.YYYY.com/XXXservice.asmx?wsdl而不是https://XXX.YYYY.com/XXXservice.asmx

接下来,您应该将所有soap客户端内容包装在try / catch块中,以获取所有可能的异常以及发生错误时的最多信息。

try {
    $client = new \SoapClient(
        'https://XXX.YYYY.com/XXXservice.asmx?wsdl',
        [
            'cache_wsdl' => WSDL_CACHE_NONE,
            'exceptions' => true,
            'soap_version' => SOAP_1_2,
            'trace' => true,
        ]
    );
} catch (\SoapFault $fault) {
    echo "<pre>";
    var_dump($fault);
    echo "</pre>";

    echo "<pre>";
    var_dump($client->__getLastRequest());
    echo "</pre>";

    echo "<pre>";
    var_dump($client->__getLastResponse());
    echo "</pre>";
}

如上面的示例所示,soap客户端使用options数组初始化。我们使用trace选项,以启用跟踪以获取最后的发送请求和响应。另外,wie使用exception选项,以强制客户端在发生任何错误的情况下引发异常。此外,只要您正在开发,我们都会禁用对wsdl设置的缓存。如果您要投入生产,则应将此选项设置为WSDL_CACHE_DISKWSDL_CACHE_MEMORY

现在您需要知道Web服务提供哪些功能和类型(复杂类型)。为此,您可以执行以下操作。

// getting the functions of your webservice
echo "<pre>";
var_dump( $client->__getFunctions() );
echo "</pre>";

// getting the types of your webservice
echo "<pre>";
var_dump( $client->__getTypes() );
echo "</pre>";

由于我不知道您的Web服务的确切范围,因此我仅假设Web服务提供了一种名为DetAcData的方法,该方法具有两个参数UseridPassword。有了这些信息,我只能猜测正确的呼叫看起来如何。有关详细信息,我需要输出__getFunctions()__getTypes()

示例电话可能如下所示。

try {
    $client = new \SoapClient(
        'https://XXX.YYYY.com/XXXservice.asmx?wsdl',
        [
            'cache_wsdl' => WSDL_CACHE_NONE,
            'exceptions' => true,
            'soap_version' => SOAP_1_2,
            'trace' => true,
        ]
    );

    $data = new \stdClass();
    $data->Userid = 'YourUserId';
    $data->Username = 'YourUsername';

    $result = $client->GetAcData($data);

    // $result will be an object
    echo "<pre>";
    var_dump($result);
    echo "</pre>"; 
} catch (\SoapFault $fault) {
    // error handling
}

您还可以为Web服务输出的函数和类型中提到的每种复杂类型编写数据对象。您可以在实例化soap客户端时将classmap添加到options数组中,以便每个响应和请求将自动在相应的数据对象中进行解析。 php文档中介绍了soap客户端类映射的工作方式。

试试看。我敢肯定,您将自己获得它。 ;)