如果HTTP状态代码!= 200,Silex会给出空响应

时间:2015-08-22 00:36:30

标签: rest http http-headers cors silex

我正在尝试设置一个小的Silex RESTFul服务器,现在我正在使用HTTP标头。

一个 GET 功能检查 If-Modified-Since 标头,并与数据库 Last-Modified 项进行比较。

这是一个小代码示例:

if($hasModifications){
  $response = [items]
  $statusCode = 200;
} else {
  $response = ['result'=>'no modifications'];
  $statusCode = 304;
}
return $app->json($response,$statusCode,$headers);

每当 $ statuscode!= 200 时,我只会获得一个空白页面,也不会发送自定义标题。这也打破了CORS,因为我无法设置 Access-Control-Allow-Origin 标题。

我应该采取其他方式吗?

(PS:这不是实际的代码,如果我将 $ statusCode 替换为200,那么一切都恢复正常)

更新 到目前为止,我想从我所阅读的内容来看,304状态不应该在回复的身体上发送任何内容。但是标题怎么样?如果我不遵守CORS,那么AngularJS前端将失败,我将无法捕捉到#34; Not Modified"例外!。 显然,我可以通过其他方式解决这个问题。但如果我能让两件事情都正常工作(REST + CORS),那就太好了!

更新2:

var_dump($headers)
array(4) {
  ["Last-Modified"]=> string(29) "Fri, 21 Aug 2015 22:47:53 GMT"
  ["X-Status-Code"]=> int(304) 
  ["Cache-Control"]=> string(25) "post-check=0, pre-check=0" 
  ["Pragma"]=> string(8) "no-cache"
}

请注意,我使用 X-Status-Code 来通知真实的HTTP状态。 现在,代码的响应行如下:

return $app->json($response,200,$headers);

如果我将 200 更改为 304 ,我将无法看到var_dump的输出(给我一个空白页面)。此外,如果我设置304状态没有标头参数,它仍然是相同的。 似乎返回 $ app-> json 清除了HeaderBag,因为我使用的是 JDesrosiers \ Silex \ Provider \ CorsServiceProvider(),并且这些标头参数也会被清除。

这是从状态代码 304

的Firefox获取的原始HTTP响应
Cache-Control: post-check=0, pre-check=0, private
Connection: Keep-Alive
Date: Sat, 22 Aug 2015 19:52:18 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.7 (Ubuntu)

而且,状态代码 200

Cache-Control: post-check=0, pre-check=0, private
Connection: Keep-Alive
Content-Length: 25
Content-Type: application/json
Date: Sat, 22 Aug 2015 19:53:12 GMT
Keep-Alive: timeout=5, max=100
Last-Modified: Fri, 21 Aug 2015 22:47:53 GMT
Pragma: no-cache
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.11
X-Status-Code: 304

0 个答案:

没有答案