我不确定这是否可以在symfony中,所以我提出了一个问题。高级场景是:
- API上的请求(构建为Symfony)必须在响应主体上返回 session-id
- 请求的起源必须在其成功请求 的标题上包括返回的 session-id
- API必须检查请求标头是否具有 session-id ,如果这样做必须在Symfony Session上设置该会话
出于测试目的,我正在为浏览器实例使用两个REST客户端:
- Postman(Chrome)
- httprequester(firefox)
这是我所做的代码的方法:
Postman的请求:
POST http://path.domain/api/url/
Content-Type: application/json
{
"key": "value"
}
使用httpfoundation会话,我设置了一个会话:
$session = new Session();
$session->set('session-id', $session->getId());
$session->set('timestamp', time());
然后返回,这是响应:
200 OK
Content-Type: application/json
{
"session-id": "1a69f956b8efc5ab465356e3257a3230",
"timestamp": 1487850859
}
现在,要模拟来自不同实例的另一个响应,我使用httprequester,但是在标题上使用 session-id :
POST http://path.domain/api/url/
Content-Type: application/json
{
"key": "value",
"session-id": "1a69f956b8efc5ab465356e3257a3230"
}
通过具有不同的请求实例,我希望Symfony会生成新的会话(新的时间戳值)。但是对于我的情况,我想使用请求标题中的一个设置会话ID ,以便我可以访问上一个响应中返回的上一个 timestamp 。P>
我创建了一个内核事件,以便我可以拦截请求并检查请求是否具有 session-id 然后进行会话设置。
// Get all PHP global variables
$request = Request::createFromGlobals();
// Check if the request
if ($request->headers->has('session-id')) {
$session = new Session();
$session->setId($request->headers->get('session-id'));
}
但是,如果我这样做,我会得到错误:
"error": {
"code": 500,
"message": "Internal Server Error",
"exception": [
{
"message": "Cannot change the ID of an active session",
"class": "LogicException",
...
我想念什么?这可能吗?
您是否尝试过这样的事情:
if ($request->headers->has('session-id')) {
$session = new Session();
$session->start();
$sess = $session->get('session-id');
$session->set('session-id', $sess);
...
}
我在文档中看到了get
函数,但我通常不使用会话,所以我不知道这是否会起作用。
您可以尝试吗?