Symfony2 Guzzle 存储请求的 cookie
Symfony2 Guzzle store cookie for request
正在尝试让我的 Symfony2 控制器向支持 API 发出请求。需要存储在第一个 API 请求时收到的 cookie,以便在第二个请求中使用它。
这是我的控制器代码:
use Guzzle\Http\Client;
use Guzzle\Plugin\Cookie\CookiePlugin;
use Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar;
class DefaultController extends Controller
{
public function verifyurlActionOK(Request $request)
{
$cookiePlugin = new CookiePlugin(new ArrayCookieJar());
$client = new Client();
$this->get('session')->set('client', $client);
$client->addSubscriber($cookiePlugin);
$request = $client->get('https://address/scanit?url='.$scantarget);
$response = $request->send();
}
public function progressAction(Request $request)
{
$cli = $session->get('client');
$crequest = $cli->get('https://address/progress');
$response = $crequest->send();
return $this->render('AppBundle:Default:progress.html.twig',
array(
'response' => $cresponse->getBody()));
}
}
试图将 Client 设置为 DefaultController class 中的 public 变量,并在会话(序列化)中设置为上述变量。两者似乎都不起作用,这里错误出现在 progressAction
中的 get() 上
[2016-11-29 16:22:46] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalErrorException: "Error: Call to a member function get() on a non-object"
如何从 progressAction 中的 verifyurlActionOK 访问 $client?
谢谢,
最佳做法是创建一个包含 Client
实例的共享服务,并在两个操作中使用它。您可以存储 cookie,而不是将 Client 存储在会话中。
Symfony 有一个关于如何创建服务的很好的文档页面:http://symfony.com/doc/current/service_container.html
在 progressAction 方法中,您错过了从容器获取会话的机会。尝试添加行 $session = $this->get('session')
例如:
public function progressAction(Request $request)
{
$session = $this->get('session')
$cli = $session->get('client');
我建议您在会话中存储 CookieJar 对象(它实现可序列化并且可以存储在会话中)而不是 Client 对象实例。例如:
public function verifyurlActionOK(Request $request)
{
$cookieJar = $this->get('session')->get('cookie-jar', new ArrayCookieJar());
$cookiePlugin = new CookiePlugin($cookieJar);
$client = new Client();
$client->addSubscriber($cookiePlugin);
$request = $client->get('https://address/scanit?url='.$scantarget);
$response = $request->send();
$this->get('session')->set('cookie-jar', $cookieJar);
}
public function progressAction(Request $request)
{
$cookieJar = $this->get('session')->get('cookie-jar');
$cookiePlugin = new CookiePlugin($cookieJar);
$cli = new Client();
$cli->addSubscriber($cookiePlugin);
$crequest = $cli->get('https://address/progress');
$response = $crequest->send();
return $this->render('AppBundle:Default:progress.html.twig',
array(
'response' => $cresponse->getBody()));
}
希望对您有所帮助
正在尝试让我的 Symfony2 控制器向支持 API 发出请求。需要存储在第一个 API 请求时收到的 cookie,以便在第二个请求中使用它。
这是我的控制器代码:
use Guzzle\Http\Client;
use Guzzle\Plugin\Cookie\CookiePlugin;
use Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar;
class DefaultController extends Controller
{
public function verifyurlActionOK(Request $request)
{
$cookiePlugin = new CookiePlugin(new ArrayCookieJar());
$client = new Client();
$this->get('session')->set('client', $client);
$client->addSubscriber($cookiePlugin);
$request = $client->get('https://address/scanit?url='.$scantarget);
$response = $request->send();
}
public function progressAction(Request $request)
{
$cli = $session->get('client');
$crequest = $cli->get('https://address/progress');
$response = $crequest->send();
return $this->render('AppBundle:Default:progress.html.twig',
array(
'response' => $cresponse->getBody()));
}
}
试图将 Client 设置为 DefaultController class 中的 public 变量,并在会话(序列化)中设置为上述变量。两者似乎都不起作用,这里错误出现在 progressAction
中的 get() 上[2016-11-29 16:22:46] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalErrorException: "Error: Call to a member function get() on a non-object"
如何从 progressAction 中的 verifyurlActionOK 访问 $client?
谢谢,
最佳做法是创建一个包含 Client
实例的共享服务,并在两个操作中使用它。您可以存储 cookie,而不是将 Client 存储在会话中。
Symfony 有一个关于如何创建服务的很好的文档页面:http://symfony.com/doc/current/service_container.html
在 progressAction 方法中,您错过了从容器获取会话的机会。尝试添加行 $session = $this->get('session')
例如:
public function progressAction(Request $request)
{
$session = $this->get('session')
$cli = $session->get('client');
我建议您在会话中存储 CookieJar 对象(它实现可序列化并且可以存储在会话中)而不是 Client 对象实例。例如:
public function verifyurlActionOK(Request $request)
{
$cookieJar = $this->get('session')->get('cookie-jar', new ArrayCookieJar());
$cookiePlugin = new CookiePlugin($cookieJar);
$client = new Client();
$client->addSubscriber($cookiePlugin);
$request = $client->get('https://address/scanit?url='.$scantarget);
$response = $request->send();
$this->get('session')->set('cookie-jar', $cookieJar);
}
public function progressAction(Request $request)
{
$cookieJar = $this->get('session')->get('cookie-jar');
$cookiePlugin = new CookiePlugin($cookieJar);
$cli = new Client();
$cli->addSubscriber($cookiePlugin);
$crequest = $cli->get('https://address/progress');
$response = $crequest->send();
return $this->render('AppBundle:Default:progress.html.twig',
array(
'response' => $cresponse->getBody()));
}
希望对您有所帮助