SOAP PHP:如何将请求文件转换为PHP函数调用

时间:2017-10-17 13:03:45

标签: php soap

我从PHP的SOAP库开始,我无法弄清楚如何执行我的请求:

服务器有一个用户友好的API,它给了我通过的请求,但我不知道我应该怎么做。

以下是我目前的观点:

$soap = new SoapClient("https://www.dmc.sfr-sh.fr/DmcWS/1.5.6/MessagesUnitairesWS?wsdl");

$soap->getSingleCallCra();

我应该通过的请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://servicedata.ws.dmc.sfrbt/">
 <soapenv:Header>
  <ser:authenticate>
   <serviceId>********</serviceId>
   <servicePassword>******</servicePassword>
   <spaceId>*******</spaceId>
   <lang>fr_FR</lang>
  </ser:authenticate>
 </soapenv:Header>
 <soapenv:Body>
  <ser:getSingleCallCra>
   <beginDate>2017-10-17T00:00:00</beginDate>
  </ser:getSingleCallCra>
 </soapenv:Body>
</soapenv:Envelope>

SOAP客户端适用于没有参数的其他函数,但是当我调用此函数时,我得到了一个已翻译的java NPE异常。

有谁能告诉我如何将参数和验证传递给函数?

感谢。

2 个答案:

答案 0 :(得分:3)

$soap = new SoapClient("https://www.dmc.sfr-sh.fr/DmcWS/1.5.6/MessagesUnitairesWS?wsdl");

要向soapcall添加标头,请使用__setSoapHeaders方法,如下所示:

$soap->__setSoapHeaders(array(
  //(namespace, name, data)
  new SoapHeader("http://servicedata.ws.dmc.sfrbt/",'authenticate',array(
    'serviceId' => '********',
    'servicePassword' => '******',
    'spaceId' => '*******',
    'lang' => 'fr_FR',
  ))
));

这些参数将进入肥皂体。在PHP中,您可以使用对象或关联数组作为输入,因为它们都被解释为xml,如key =&gt;价值对。

$soap_body_parameters = array(
  'beginDate' => '2017-10-17T00:00:00',
);

$response = $soap->getSingleCallCra($soap_body_parameters);

print_r($response);

soapclient类的返回值始终是一个对象,因此请记住使用箭头符号&#39; $ object-&gt; property&#39;获取相关数据。

您还可以创建一个这样的类,它将在每个调用的后台处理标题,数据提取等

class sfr_soap {
  function __construct($serviceId, $servicePassword, $spaceId, $lang = 'fr_FR'){
    $url = "https://www.dmc.sfr-sh.fr/DmcWS/1.5.6/MessagesUnitairesWS?wsdl";
    $this->client = new SoapClient($url);
    $soap->__setSoapHeaders(array(
        new SoapHeader("http://servicedata.ws.dmc.sfrbt/",'authenticate',array(
            'serviceId' => $serviceId,
            'servicePassword' => $servicePassword,
            'spaceId' => $spaceId,
            'lang' => $lang,
        ))
    ));
  }
  public function __call($name, $args = array()){
    $response = $this->client->$name($args);
    // do something with the response here, like extract the meaningful parts of the data
    return $response;
  }
}

init喜欢这个

$sfr = new sfr_soap($serviceId, $servicePassword, $spaceId);

或者像这样,如果你想指定语言

$sfr = new sfr_soap($serviceId, $servicePassword, $spaceId, $lang);

像这样使用

$data = $sfr->getSingleCallCra(array(
  'beginDate' => '2017-10-17T00:00:00'
));

答案 1 :(得分:1)

您可以通过多种方式将参数传递给SOAP函数调用,如文档中所述:SoapClient::__soapCall

  

传递给函数的参数数组。这可以是有序数组或关联数组。请注意,大多数SOAP服务器都需要提供参数名称,在这种情况下,它必须是关联数组。

所以在你的情况下,电话应该是:

$soap->getSingleCallCra(array(
   'beginDate'  => '2017-10-17T00:00:00',
));

我希望,我可以提供任何帮助。