Я развернул 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>
Мой код 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);
Но затем я получаю «Примечание: преобразование массива в строку», когда я делаю вызов.
Ваша ошибка в мелочах.
Для вызова, использующего 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 нуждается в таком лечении.
надеюсь, это поможет
Решение состоит в том, чтобы указать литеральный стиль документа, как это объясняется в
Создание вызова SOAP с использованием PHP с телом XML
Как я уже сказал выше, «я заметил, что имя возвращаемого элемента (»idXMLReturn
«) не совпадает с именем, описанным в WSDL («DescargarInfoTiempoReturn
«)» Итак, вот в чем проблема: AXIS не генерирует конверт, который соответствует схеме WSDL. Кажется, провайдер java: RPC не беспокоится о возвращаемых именах операций.
Сейчас я решил это, переименовав параметр из «idXML
«до»DescargarInfoTiempo
«, поэтому SOAP ответ будет»DescargarInfoTiempoReturn
«и это будет соответствовать схеме WSDL, и PHP правильно отобразит ответ.