Я сделал веб-приложение, которое использует обмены SOAP для получения данных из веб-API. Первоначально это было сделано процедурным способом, и сейчас я пытаюсь переместить его в рамки Laravel. у меня есть view
настроен для отображения пользователю, если в ответе SOAP указано «Запрос отклонен сервером Throttle», но я не знаю, как проверить эту конкретную ошибку. Вот класс:
<?php namespace App\Models;
use SoapClient;
use Illuminate\Http\RedirectResponse;
class SoapWrapper {
public function soapExchange() {
// set WSDL for authentication and create new SOAP client
$auth_url = "http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl";
// set WSDL for search and create new SOAP client
$search_url = "http://search.webofknowledge.com/esti/wokmws/ws/WokSearch?wsdl";
// array options are temporary and used to track request & response data
$auth_client = @new SoapClient($auth_url);
// array options are temporary and used to track request & response data
$search_client = @new SoapClient($search_url);
// run 'authenticate' method and store as variable
$auth_response = $auth_client->authenticate();
// call 'setCookie' method on '$search_client' storing SID (Session ID) as the response (value) given from the 'authenticate' method
// check if an SID has been set, if not it means Throttle server has stopped the query, therefore display error message
if (isset($auth_response->return)) {
$search_client->__setCookie('SID',$auth_response->return);
} else {
return Redirect::route('throttle');
}
}
}
Проблема состоит в том, что он выдает ошибку Laravel по умолчанию «Запрос отклонен сервером Throttle» в $auth_response = $auth_client->authenticate();
прежде чем он доберется до if
оператор, который проверяет, было ли возвращено значение (SessionID) запросом SOAP. Он не делал этого, когда по какой-то причине был настроен процедурно.
if
оператор проверяет, было ли возвращено значение из authenticate()
метод и, если он есть, назначает его (SessionID) в cookie поискового клиента для авторизации поиска. В противном случае отображается пользовательское сообщение об ошибке.
Я пытался использовать is_soap_fault
но это не улавливает, потому что технически это не мыльная ошибка. Я также попытался удалить строку, вызывающую проблему, и изменить if
заявление для:
if (isset($auth_client->authenticate()->return) {...
Но это также вызывает страницу по умолчанию Laravel SoapFault. return Redirect::route('throttle')
отображает пользовательскую страницу ошибки, сохраненную как throttle.blade.php
,
Кто-нибудь знает, как я могу проверить на ошибку газа?
Неважно, нашел ответ здесь: Поймать исключение при правильном создании нового SoapClient.
В любом случае я опубликую свой исправленный код на всякий случай, если он пригодится кому-либо еще в будущем:
<?php namespace App\Models;
use SoapClient;
use Illuminate\Http\RedirectResponse;
class SoapWrapper {
public function soapExchange() {
try {
// set WSDL for authentication and create new SOAP client
$auth_url = "http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl";
// set WSDL for search and create new SOAP client
$search_url = "http://search.webofknowledge.com/esti/wokmws/ws/WokSearch?wsdl";
// array options are temporary and used to track request & response data
$auth_client = @new SoapClient($auth_url);
// array options are temporary and used to track request & response data
$search_client = @new SoapClient($search_url);
// run 'authenticate' method and store as variable
$auth_response = $auth_client->authenticate();
// add SID (SessionID) returned from authenticate() to cookie of search client
$search_client->__setCookie('SID', $auth_response->return);
} catch (\SoapFault $e) {
return Redirect::route('throttle');
}
}
}
Других решений пока нет …