Не удалось сохранить сеанс для второго клиентского запроса с использованием Zend_Http_Client
Я отправляю несколько запросов одному клиенту. zend_Http_Client не может перенаправить, потому что наш сайт дает перенаправление javascript. И из этого javascript я получаю URL перенаправления и снова вызываю клиента, теперь я получаю отказано в доступе. Это потому, что я не могу сохранить сеанс с первого запроса клиента.
Я использую следующий код..
$client = new Zend_Http_Client(
$loginUrl,
array(
'keepalive' => true,
'timeout' => 1000
)
);
$response = $client->request()->getBody();
$redirectUrl = $this->_getResponseRedirectUrl($response);
$client->resetParameters();
$client->setUri($redirectUrl);
$response = $client->request()->getBody();
$resultUrl = $this->_getResponseRedirectUrl($response);
Может кто-нибудь сказать мне, как сохранить сеанс для второго запроса.
2 ответа
Перед выполнением следующих шагов убедитесь, что аутентификация вашего сервера основана на сессионных куки.
Решение сработало для меня:
Вам нужно добавить куки с первого покоя на второй запрос. В этом случае сервер считает ваш второй запрос аутентифицированным. В ответе после входа на сайт ваш файл cookie будет иметь следующий набор значений, таких как имя файла cookie, значение cookie, срок действия, путь, безопасный и HTTPOnly. Из строки cookie взрываются cookie-name и cookie-value
Пример Session Cookie после входа в систему:
"JSESSIONID=DQl3NKXXmy3yntp3NW2GMlcn8pLn9PR9rl0lnR6vbtfdVpyHWdnq!598502565; path=/"
"CK_LanguageID_252085=1; expires=Friday, 23-Mar-2012 05:31:03 GMT; path=/; secure"
"CK_TimeZone_252085=4; expires=Friday, 23-Mar-2012 05:31:03 GMT; path=/; secure"
Создайте новую строку cookie для дальнейшего взаимодействия с сервером по следующей схеме:
"JSESSIONID=DQl3NKXXmy3yntp3NW2GMlcn8pLn9PR9rl0lnR6vbtfdVpyHWdnq!598502565; CK_LanguageID_252085=1; CK_TimeZone_252085=4"
Добавление удобного метода для создания строки cookie из массива zend_http_client "Set-cookie".
/**
* Get clean cookie string with only name,value pair
* This method filer all the follwoing cookie information
* Expiration Date, Path, Secure and HTTPOnly
* @access public
* @param {Array} $cookies
* @return {String} $cookieString
*/
public function getCookieString(array $cookies){
$cookieString = null;
foreach($cookies as $cookie){
$part = explode(';',$cookie);
$cookieString = ($cookieString == null)? $part[0] : $cookieString . '; ' . $part[0];
}
return $cookieString;
}
Использование Zend_Http_Client для выполнения последовательных запросов:
//Login
$client = new Zend_Http_Client($loginUrl);
$response = $client->request();
//Get Header from response
$headers = $response->getHeaders();
//Create second header
$header = array("Cookie" => $this->getCookieString($headers["Set-cookie"]));
$client->setHeaders($header);
//Second request
$client->setUri($redirectUrl);
$response = $client->request();
Здесь я удаляю "$client->resetParameters();" потому что вы не устанавливаете какие-либо GET-параметры, используя "$client->setParameterGet()"(тоже самое для POST)
При использовании "$ client-> setParameterGet ()" или "$client->setParameterPost()" используйте "$client->resetParameters();" перед установкой второго ури.
$ client-> resetParameters () принимает логические значения:
- FALSE: это значение по умолчанию, которое сбрасывает только параметры POST и GET.
- TRUE: сброс всех параметров, включая заголовки, последний запрос и последний ответ.
На самом деле Zend_Http_Client предоставляет очень простой способ сделать то, что вы сделали, не нужно изобретать велосипед здесь.
$client = new Zend_Http_Client(
$loginUrl,
array(
'keepalive' => true,
'timeout' => 1000
)
);
// this is the magic line...
$client->setCookieJar();
$response = $client->request()->getBody();
$redirectUrl = $this->_getResponseRedirectUrl($response);
$client->resetParameters();
$client->setUri($redirectUrl);
$response = $client->request()->getBody();
$resultUrl = $this->_getResponseRedirectUrl($response);
Читайте больше здесь: http://framework.zend.com/manual/en/zend.http.cookies.html