веб-сервисы — PHP SOAPCall нулевой результат

Я развернул SOAP WS с ОСью. Я использую библиотеку SOAPClient и PHP 5.5.9 в Ubuntu 14.04 для вызова доступных операций, но когда я делаю «__SoapCall», он ничего не возвращает. Я также пытался с библиотекой «NuSOAP», но я получаю тот же результат.
Но когда я вызываю «__getLastResponse», он возвращает хороший ответ (хотя и дублированный), как вы можете видеть:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<idXMLReturn xmlns="http://aemetproyecto">PD94bWwgdm...</idXMLReturn>
</soapenv:Body>
</soapenv:Envelope>

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<idXMLReturn xmlns="http://aemetproyecto">PD94bWwgdm...</idXMLReturn>
</soapenv:Body>
</soapenv:Envelope>

Вот WSDL

Мой код PHP:

<?php

function generarTabla($id, $formato){
try{

// Create the SoapClient instance
$url = "http://localhost:8080/axis/services/AemetProyect?wsdl";

$client = new SoapClient($url, array("trace" => 1, "exception" => 1));

// Creo XML
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml .= "<!DOCTYPE id [\n";
$xml .= "<!ELEMENT id (#PCDATA)>\n";
$xml .= "]>\n";
$xml .= "<id>".$id."</id>";

// Codifico XML en Base64
$Base64xml = base64_encode($xml);

// Llamada SOAP a DescargarInfoTiempo
$resultado = $client -> __soapCall("DescargarInfoTiempo",
array($Base64xml));

//$resultado = $client -> __getLastResponse();
//echo $resultado;
//$resultado = $client -> __getLastRequest();
//echo $resultado;

echo $resultado;
} catch (SoapFault $ex){
$error = "SOAP Fault: (faultcode: {$ex->faultcode}\n"."faultstring: {$ex->faultstring})";
echo $error;
} catch (Exception $e){
$error = "Exception: {$e->faultstring}";
echo $error;
}
}

?>

Я заметил, что имя возвращаемого элемента («idXMLReturn») не совпадает с именем, описанным в WSDL («DescargarInfoTiempoReturn»).
Может ли это быть проблемой?

Обновить

Я пытался сделать:

$argumens['idXML'] = $Base64xml;
$resultado = $client -> __soapCall("DescargarInfoTiempo",
array($arguments));

а также

$arguments['idXML'] = $Base64xml;
$resultado = $client ->DescargarInfoTiempo($arguments);

Но затем я получаю «Примечание: преобразование массива в строку», когда я делаю вызов.

0

Решение

Ваша ошибка в мелочах.

Для вызова, использующего SoapClient, вы должны отправлять аргументы в массиве аргументов, вместо того, чтобы отправлять xml (зачем вам нужна кодификация base64? Является ли какое-то правило вашего WebService?). Увидеть PHP документы чтобы получить правильный путь

аргументы
Массив аргументов для передачи в функцию. Это может быть упорядоченный или ассоциативный массив. Обратите внимание, что большинство серверов SOAP требуют предоставления имен параметров, в этом случае это должен быть ассоциативный массив.

Итак, аргументы вашего массива * должны быть примерно такими:

$arguments['id'] = $id// if you need base 64, use base64_encode($id) or something
$resultado = $client -> __soapCall("DescargarInfoTiempo",array($arguments));

Другой вариант сделать то же самое, это вызвать функцию напрямую:

$arguments['id'] = $id// if you need base 64, use base64_encode($id) or something
$resultado = $client ->DescargarInfoTiempo($arguments);// note that we don't need array($arguments), just $arguments

Смотрите другие примеры в комментариях на странице документа.

Наконец, если вы все еще хотите создать свой XML для отправки, я советую вам сделать это с помощью других методов, таких как file_get_contents или CURL, и не забудьте создать свой XML с мыльным конвертом, который необходим для Протокол мыла

* Некоторым старым WebServices нужен массив с именем «параметры»

ОБНОВИТЬ

Послушайте, вы пытаетесь отправить ваши $ аргументы в массиве, который содержит только один элемент: XML в вашей переменной $ Base64xml. Я думаю, что проблема все еще здесь.

В соответствии с Руководство по PHP, вы не можете отправить XML в вашем SoapCall. Вар должен быть ассоциативный массив с вашими переменными, так что попробуйте сделать что-то вроде этого:

$arguments['id'] = $id// this $id var is your function argument(int, string or somenthing else), forget the created XML
$resultado = $client -> __soapCall("DescargarInfoTiempo",array($arguments));

Что касается base64, который вам нужен, я никогда не нуждался в этом раньше, но посмотрите marcovtwout комментарий на этой странице Руководство по PHP

Если ваш файл WSDL содержит параметр с типом base64Binary, вы не должны использовать base64_encode () при передаче ваших мыльных переменных. При выполнении запроса библиотека SOAP автоматически base64 кодирует ваши данные, так что в противном случае вы будете кодировать их дважды.

Итак, я верю, что вам не нужно кодировать свои переменные.

Короче, забудьте про XML и отправляйте только свои переменные. PHP SoapClient создает конверт Soap с исправленными кодировками и всем этим.

Если у вас все еще есть проблемы с этим, попробуйте добавить ваш вар с некоторыми SoapVars. Может быть, ваша конфигурация WSDL нуждается в таком лечении.

надеюсь, это поможет

1

Другие решения

Решение состоит в том, чтобы указать литеральный стиль документа, как это объясняется в
Создание вызова SOAP с использованием PHP с телом XML

0

Как я уже сказал выше, «я заметил, что имя возвращаемого элемента (»idXMLReturn«) не совпадает с именем, описанным в WSDL («DescargarInfoTiempoReturn«)» Итак, вот в чем проблема: AXIS не генерирует конверт, который соответствует схеме WSDL. Кажется, провайдер java: RPC не беспокоится о возвращаемых именах операций.

Сейчас я решил это, переименовав параметр из «idXML«до»DescargarInfoTiempo«, поэтому SOAP ответ будет»DescargarInfoTiempoReturn«и это будет соответствовать схеме WSDL, и PHP правильно отобразит ответ.

0
По вопросам рекламы [email protected]