#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];