То, что вы пишете, называется proxy.
Есть some examples онлайн для сервера NuSoap, отправляющего сложные типы через метод addComplexType
.
//Create a complex type
$server->wsdl->addComplexType('MyComplexType','complexType','struct','all','',
array('ID' => array('name' => 'ID','type' => 'xsd:int'),
'YourName' => array('name' => 'YourName','type' => 'xsd:string')));
Один подход к реализации прокси, это построить свой сервис с затушил данных, так что это на самом деле не говорить на службу бэкэнда первым. Посмотрите, можете ли вы получить первоначальный клиент, удовлетворенный надуманным ответом от вашего прокси. Затем, как только вы это сделаете, использование реальной бэкэнд-службы должно быть тривиальным (операции с SOAP-клиентами в моем опыте проще, чем серверные).
Другой вариант - вместо этого рассмотреть родной класс SoapServer. Первый комментарий here показывает, как создать сложный тип.
EDIT
Осмотрев немного больше, вот это much better example.
Есть 2 способа зарегистрировать сложный тип с NuSOAP, согласно DocBlock на addComplextType
(Lib/class.wsdl.php)
/**
* adds an XML Schema complex type to the WSDL types
*
* @param string $name
* @param string $typeClass (complexType|simpleType|attribute)
* @param string $phpType currently supported are array and struct (php assoc array)
* @param string $compositor (all|sequence|choice)
* @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
* @param array $elements e.g. array (name => array(name=>'',type=>''))
* @param array $attrs e.g. array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]'))
* @param string $arrayType as namespace:name (xsd:string)
* @see nusoap_xmlschema
* @access public
*/
Посмотрите, как он это делает на последнем примере я отправил:
$server->wsdl->addComplexType('Contact',
'complexType',
'struct',
'all',
'',
array(
'id' => array('name' => 'id', 'type' => 'xsd:int'),
'first_name' => array('name' => 'first_name', 'type' => 'xsd:string'),
'last_name' => array('name' => 'last_name', 'type' => 'xsd:string'),
'email' => array('name' => 'email', 'type' => 'xsd:string'),
'phone_number' => array('name' => 'phone_number', 'type' => 'xsd:string')
)
);
Тогда как вернуть ответ с комплексным типом Контактной:
function updateContact($in_contact) {
$contact = new Contact($in_contact['id']);
$contact->first_name=mysql_real_escape_string($in_contact['first_name']);
$contact->last_name=mysql_real_escape_string($in_contact['last_name']);
$contact->email=mysql_real_escape_string($in_contact['email']);
$contact->phone_number=mysql_real_escape_string($in_contact['phone_number']);
if ($contact->update()) return true;
}
Вы также можете увидеть, как использовать вариант массива в его примере. Извините за огромный ответ!
Благодарим за отзыв, что касается данных с заглублением, мы всегда хотим отправить последний ответ от сервера, что означает, что даже если API-интерфейс поставщика изменился или возвращает другой результат, наш API также должен отражать то же самое в реальном времени. Таким образом, в этой ситуации могут быть трудно использованы данные с заглублением. Перейти к примеру complextype для nusoap, Нужно ли мне разбирать объект, идущий с сервера, а затем переназначить его в массиве для создания сложного типа? Также я могу построить complextype внутри метода в моем API или он должен быть вне метода? – Ricky
А, это может быть немного больно для реализации, но я слышу вас на заглубленных данных. Для сложного типа вы хотите зарегистрировать сложный тип, а затем в методе, обрабатывающем запрос ('updateContact' во втором примере выше), клиент отправит вам запрос на использование« soapclient »для подключения к серверной службе. Выполните анализ ответа от него, создайте объект или массив (на основе опции 'struct' или' array' в 'addComplexType', затем верните это из обработчика. – quickshiftin