Почему успех не возвращается в моем PHP WSDL (Zf2) - PullRequest
0 голосов
/ 06 июля 2019

Я использовал эти два ресурса в качестве стартовой площадки для своего создания сервера конечных точек WSDL.

https://odan.github.io/2017/11/20/implementing-a-soap-api-with-php-7.html
https://www.youtube.com/watch?v=e_7jDqN2A-Y&t=799s

Объединив эти два, я смог создать гибридную систему, которая работает.Моя проблема, которую я сейчас пытаюсь решить, это получение ответа от сервера api.php / endpoint.

В примере с odan git это сработало до буквы.Но однажды я внес изменения в код, который требует объектов.Я начал получать ошибки.

PHP Notice:  Trying to get property of non-object

Вот часть кода сервера.


class wenoError
{
    public $response = "Sucess";

    public static function authenticate($header_params)
    {
        if($header_params->username == 'WEX' && $header_params->password == 'WEX1') return true;
        else throw new SOAPFault('Wrong user/pass combination', 601);
    }

    /**
    * @param string $payload
    * @return string $delivery
    */
    public function receivePayload($payload)
    {

        $xml = base64_decode($payload);

        $fileName = 'message-'.rand().'.xml'; 
        $file = file_put_contents('messages/'.$fileName, $xml);
        $xml2json = simplexml_load_string($xml);
        $jsonOut = json_encode($xml2json); 
        $arrayJson = json_decode($jsonOut, TRUE);
        //$seeArray = print_r($arrayJson, true);
        //file_put_contents('messages/converted-'.$fileName.'.json', $arrayJson['Header']['MessageID']);
        $response = "Success";
        return $response;

    }

}
    $serverUrl = "https://localhost/WenoErrors/api.php";
    $options = [
        'uri' => $serverUrl,
    ];
    $server = new Zend\Soap\Server('wsdl', $options);

    if (isset($_GET['wsdl'])) {
    $soapAutoDiscover = new \Zend\Soap\AutoDiscover(new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence());
    $soapAutoDiscover->setBindingStyle(array('style' => 'document'));
    $soapAutoDiscover->setOperationBodyStyle(array('use' => 'literal'));
    $soapAutoDiscover->setClass('wenoError');
    $soapAutoDiscover->setUri($serverUrl);

    header("Content-Type: text/xml");
    echo $soapAutoDiscover->generate()->toXml();
    } else {
    $soap = new \Zend\Soap\Server($serverUrl . '?wsdl');
    $soap->setObject(new \Zend\Soap\Server\DocumentLiteralWrapper(new wenoError()));
    $soap->handle();
    }

Что я не понимаю, так это сообщение об ошибке, что $ response не являетсяобъект.Согласно руководству по PHP https://www.php.net/manual/en/language.oop5.properties.php

Свойство установлено правильно в верхней части класса, свойство объявлено и установлено нами значение.

Что пошло не так?

ОБНОВЛЕНИЕ:

Добавление кода клиента.

$client = new Zend\Soap\Client('https://localhost/WenoErrors/api.php?wsdl');
$delivery = $client->call('receivePayload',[['payload' => $message]]); 

Дамп клиента дает:

C:\eRxGateway\www\apa\WenoErrors\clientapi.php:55:
  object(client)[3]
   public 'delivery' => null

ОБНОВЛЕНИЕ:

Что наконец-то сработало для меня, так это изменение.

Первое изменение:

$server = new Zend\Soap\Server('wsdl', $options);

$server = new Zend\Soap\Server(null, $options);

1 Ответ

1 голос
/ 11 июля 2019

Мне кажется, ваш код работает нормально. Хотя я получаю другой результат, чем ваш, как показано ниже:

$client = new Zend\Soap\Client('http://localhost/test/api.php?wsdl');
$message = ' -> Hello World'; 
$delivery = $client->call('receivePayload',[['payload' => $message]]);
var_dump($delivery);

object(stdClass)#4 (1) {
  ["receivePayloadResult"]=>
  string(7) "Success"
}

Шаг 1

Пожалуйста, попробуйте удалить все файлы '/ tmp / wsdl - ****' из каталога / tmp . Кажется, вы работаете в Windows, поэтому вместо / tmp это может быть что-то вроде C: \ Windows \ Temp . Вы можете легко найти какой каталог, зайдя в файл php.ini и найдя указанную ниже директиву.

soap.wsdl_cache_dir="/tmp" 

Шаг 2

Кроме того, для целей разработки и тестирования всегда помещайте указанную ниже директиву ini в начале вашего php-файла клиента, который в вашем случае является clientapi.php file.

ini_set("soap.wsdl_cache_enabled", 0);

От вас не требуется помещать эту директиву в начале файла сервера (api.php), но вы можете это сделать, если вышеприведенное все еще не работает для вас.

...