2015-06-25 1 views
1

Я хочу отправить параметры запроса & Информация о заголовке клиента для веб-сервиса rightnow с использованием запросов SOAP PHP. Как я могу это сделать ? Пожалуйста, помогитеОтправить запрос на запросCSV метод rightnow webservice с использованием PHP

Моей структуры WSDL выглядит следующим образом:

<wsdl:operation name="QueryCSV"> 
      <soap:operation soapAction="QueryCSV" style="document"/> 
      <wsdl:input> 
       <soap:body parts="parameters" use="literal"/> 
       <soap:header message="rnw_v1_2:ClientInfoHeader" part="request_header" use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 

Я хочу передать заголовок и параметры клиента (запрос, размер_страницы, разделитель, returnrawresult, disableMTOM) методе queryCSV. Я получаю следующее сообщение об ошибке:

Неустранимая ошибка: исключение SoapFault: [soapenv: Sender] Элемент данных в сообщении NULL в index.php (112): SoapClient -> __ soapCall ('QueryCSV', Array) # 1 {главная} выброшено в index.php

Я попробовал несколько способов, один из пути я попытался здесь:

<?php 

class clsWSSEAuth { 
      private $Username; 
      private $Password; 
     function __construct($username, $password) { 
       $this->Username=$username; 
       $this->Password=$password; 
       } 
} 

class clsWSSEToken { 
     private $UsernameToken; 
     function __construct ($innerVal){ 
      $this->UsernameToken = $innerVal; 
     } 
} 

class ClientInfoHeader { 
     private $AppID; 
     function __construct ($appid){ 
      $this->AppID = $appid; 
     /} 
} 


$username = "***"; 
$password = "***"; 
$WSDL = "https://*****/services/soap?wsdl"; 
$arrOptions = array('trace' => true); 
$appid = "*****"; 


// SECURITY NAMESPACE 
$strWSSENS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 

//client infoheader namespace 
$v1 = "urn:wsdl.ws.rightnow.com/v1_2"; 

$objSoapVarUser = new SoapVar($username, XSD_STRING, NULL, $strWSSENS, NULL, $strWSSENS); 
$objSoapVarPass = new SoapVar($password, XSD_STRING, NULL, $strWSSENS, NULL, $strWSSENS); 

$objWSSEAuth = new clsWSSEAuth($objSoapVarUser, $objSoapVarPass); 
$objSoapVarWSSEAuth = new SoapVar($objWSSEAuth, SOAP_ENC_OBJECT, NULL, $strWSSENS, 'UsernameToken', $strWSSENS); 

// token object 
$objWSSEToken = new clsWSSEToken($objSoapVarWSSEAuth); 
$objSoapVarWSSEToken = new SoapVar($objWSSEToken, SOAP_ENC_OBJECT, NULL, $strWSSENS, 'UsernameToken', $strWSSENS); 
$objSoapVarHeaderVal = new SoapVar($objSoapVarWSSEToken, SOAP_ENC_OBJECT, NULL, $strWSSENS, 'Security', $strWSSENS); 

# Create the ClientInfoHeader header 
$objAppId = new SoapVar($appid, XSD_STRING, NULL, $v1, NULL, $v1); 
$objClientInfoHeader = new SoapVar($objAppId, SOAP_ENC_OBJECT, NULL, $v1, 'ClientInfoHeader', $v1); 


//soap header 
$objSoapVarWSSEHeader = array(); 
$objSoapVarWSSEHeader[] = new SoapHeader($strWSSENS, 'Security', $objSoapVarHeaderVal, true); 
$objSoapVarWSSEHeader[] = new SoapHeader($v1, 'ClientInfoHeader', $objClientInfoHeader); 

$objClient = new SoapClient($WSDL, $arrOptions); 
//set headers 
$wss_header = $objClient->__setSoapHeaders($objSoapVarWSSEHeader); 


$Query = "select ********** from ******** where id > *** "; 
$PageSize = 50; 
$Delimiter = '|'; 
$ReturnRawResult = false; 
$DisableMTOM = true; 

$params = array('Query' => $Query, 'PageSize' => $PageSize, 'Delimiter' => $Delimiter, 'ReturnRawResult' => $ReturnRawResult, 'DisableMTOM' => $DisableMTOM); 


$objResponse = $objClient->__soapCall("QueryCSV", array('parameters' => $params)); 
var_dump($objResponse); 

?> 

ответ

0

этой ошибка означает, что ваше тело XML имеет недостающие сообщения узла. Можете ли вы захватить сконструированный объект SOAP и вывести его здесь?

Вместо использования SOAPClient я бы предложил изменить подход к использованию cURL и набора сообщений о конверте SOAP, которые могут иметь динамические параметры. Вы можете использовать интерфейс SOAP для создания XML, а затем поместить его в файл, который ваш код использует для заполнения необходимых узлов.

Трудно оправдывать жесткое кодирование сообщений, когда такой инструмент, как SOAP Client, должен помочь, но я видел больше проблем, чем решения с использованием SOAPClient с OSvC WSDL. Ruby SOAP gems обрабатывает OSVC WSDL лучше, чем SOAPClient в PHP.

Смежные вопросы