Веб-сервис Yii soap с входным параметром

#php #web-services #soap #yii

#php #веб-сервисы #soap #yii

Вопрос:

Мне нужно передать специальный уникальный ключ (строку) во ввод конструктора веб-сервиса soap, созданного с использованием Yii framework. Это пример того, что я пробовал:

 class SoapController extends Controller
{
private $uniqueKey;
public function __construct()
{
    $this->uniqueKey = $_GET['uniquekey'];
}

public function actions()
{
        return array(
                'service'=>array(
                        'class'=>'CWebServiceAction',
                ),
        );
}

/*
 * @return string result
 * @soap
 */
public function actionDemo()
{
    if(isset($this->uniqueKey))
        return $this->uniqueKey;
    else
        return 'key not set';
}
}
 

URL-адрес wsdl является:
../index.php/soap/service?uniquekey=sss
Который отображает данные wsdl в браузере.
Но когда я вызываю метод демонстрационного действия (например, с помощью Visual Studio) Я получаю сообщение «Запрос не выполнен со статусом HTTP 404: Не найден».

в System.Web.Services.Протоколы.SoapHttpClientProtocol.ReadResponse(сообщение SoapClientMessage, ответ WebResponse, поток ответного потока, логический asyncCall) в System.Web.Services.Протоколы.SoapHttpClientProtocol.Вызов (строковое имя метода, параметры объекта[]) …

Веб-сервис работал до добавления части ‘?uniquekey= sss’.

Есть ли другой способ передать $uniqueKey в качестве параметра для метода __construct, или, может быть, мне нужно настроить метод actions() ? Пожалуйста, я ценю любой совет.

Ответ №1:

Вы можете отправить uniquekey непосредственно в качестве параметра $_GET в функцию:

index.php?r=SoapController/Showamp;uniquekey=the_unique_key

Контроллер Yii:

 class SoapController extends Controller
{
    public function actionShow($uniquekey)
    {
        //SOAP connect

        $this->render('show',array(
            'soap_data'=>$soap_data,
        ));
    }
}
 

Пример PHP SOAP:

 $options = array(
    'exceptions'=>true,
    'trace'=>1,
);

$client = new SoapClient("https://s7sps3apissl.scene7.com/scene7/webservice/IpsApi-2012-02-14.wsdl",$options);

$ns = 'http://www.scene7.com/IpsApi/xsd';

$auth = (object)array(
    'ns2:user' => 'xXx',
    'ns2:password' => 'xXx'
);

$header = new SoapHeader($ns, "authHeader", $auth, false);

$client->__setSoapHeaders(array($header));

//get company handle
$client->getCompanyInfo(array('companyName' => 'xXx'));

//extract company handle
preg_match('~<companyHandle>(.*?)</companyHandle>~s',$client->__getLastResponse(),$companyHandleMatch);

echo $companyHandleMatch[1];