2013-12-16 8 views
2

Я создаю веб-сервис, используя библиотеку NuSoap в PHP. Мой веб-сервис будет действовать как средний уровень между клиентом и уже существующим веб-сервисом поставщиком. Поэтому вместо того, чтобы клиент напрямую подключался к поставщику, они подключаются к моей веб-службе, мой веб-сервис подключается к поставщику и захватывает ответ и отправляет тот же ответ обратно клиенту.Сложный тип в PHP NuSoap

Моя единственная проблема - мой поставщик отправляет обратно объект stdclass (их веб-сервис написан на .Net), и я должен получить этот объект и отправить тот же объект клиенту по моему методу webservice.

Я искал довольно много в Интернете, но нет четких способов, как это сделать с помощью библиотеки NuSoap. Независимо от того, что я прочитал до сих пор, укажите, что мне нужно использовать сложный тип для этого, но опять же я не знаю, как захватить ответ, а затем преобразовать его в сложный тип и отправить его клиенту.

Заранее за вашу помощь.

ответ

1

То, что вы пишете, называется 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; 
} 

Вы также можете увидеть, как использовать вариант массива в его примере. Извините за огромный ответ!

+0

Благодарим за отзыв, что касается данных с заглублением, мы всегда хотим отправить последний ответ от сервера, что означает, что даже если API-интерфейс поставщика изменился или возвращает другой результат, наш API также должен отражать то же самое в реальном времени. Таким образом, в этой ситуации могут быть трудно использованы данные с заглублением. Перейти к примеру complextype для nusoap, Нужно ли мне разбирать объект, идущий с сервера, а затем переназначить его в массиве для создания сложного типа? Также я могу построить complextype внутри метода в моем API или он должен быть вне метода? – Ricky

+0

А, это может быть немного больно для реализации, но я слышу вас на заглубленных данных. Для сложного типа вы хотите зарегистрировать сложный тип, а затем в методе, обрабатывающем запрос ('updateContact' во втором примере выше), клиент отправит вам запрос на использование« soapclient »для подключения к серверной службе. Выполните анализ ответа от него, создайте объект или массив (на основе опции 'struct' или' array' в 'addComplexType', затем верните это из обработчика. – quickshiftin

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