2011-05-28 85 views
81

我有一个API调用,我需要能够运行一些检查并可能返回各种状态代码。我不需要自定义视图或任何东西,我只需要返回正确的代码。如果用户没有通过适当的凭据,我需要返回401状态。如果他们没有发送支持的请求格式,我需要返回400状态。设置响应状态代码

因为它是一个API,我真正想要做的就是设置响应状态并退出一个简单,愚蠢的消息,说明为什么请求失败(可能使用exit)。只是为了完成工作,但我一直无法让这个工作正确。我尝试过使用PHP的header()和Cake的$this->header()(这全部在控制器中),但尽管我收到退出消息,但标题显示的是200 OK状态。

使用下面的代码,我收到消息,但没有设置标题。我错过了什么?

if(!$this->auth_api()) { 
    header('401 Not Authorized'); 
    exit('Not authorized'); 
    } 

回答

115

PHP < = 5.3

header()功能有状态代码的参数。如果您指定它,服务器将从那里处理它。

header('HTTP/1.1 401 Unauthorized', true, 401); 

PHP> = 5.4

见Gajus'回答:https://stackoverflow.com/a/14223222/362536

+1

有趣。我从来没有见过这个使用,但手册当然同意你的看法。这对我来说是一种更好的方法。 – 2011-05-28 21:07:53

+0

值得一个惩罚性的头巴掌。我完全错过了匆忙中明显的表现。谢谢你让我挺直,伙计们。 – 2011-05-28 21:19:27

+0

我发现你需要把状态描述放入第一个参数才能使这个工作正常...... – 2011-08-21 23:20:06

10

我不认为你正确设置header,试试这个:

header('HTTP/1.0 401 Unauthorized'); 
4

我有同样的问题与CakePHP的2.0.1

我尝试使用

header('HTTP/1.1 400 BAD REQUEST'); 

$this->header('HTTP/1.1 400 BAD REQUEST'); 

但是,这些都解决了我的问题。

我没有最终使用

$this->header('HTTP/1.1 400: BAD REQUEST'); 

之后,没有任何错误或PHP/CakePHP的警告解决。在最后的$this->header函数调用中,我在400和错误的描述文本之间放了一个冒号(:)。

10

为什么不使用Cakes Response Class? 您可以简单地通过这个设置响应状态代码:

$this->response->statusCode(200); 

然后,只需渲染错误信息,这与JSON适合最好的一个文件。

+0

在问题时没有2.x但是 – mark 2012-08-18 11:23:43

+0

啊,对不起。没有注意到。我的错。 – nahri 2012-08-18 11:37:10

+0

直到我在该行之前添加了该错误 '$ this-> autoRender = false;' – 2014-10-14 23:04:19

96

自PHP 5.4起,您可以使用http_response_code

http_response_code(404); 

这将负责设置正确的HTTP标头。

如果您正在运行PHP < 5.4,那么你有两种选择:

  1. 升级。
  2. 使用在PHP中实现的this http_response_code function
+1

+提供更新的答案,因为此问题是最重要的结果之一。 – 2014-03-28 01:53:55

2

正如之前所写,但对于像我这样的初学者不要忘记包括回报。

$this->response->statusCode(200); 
return $this->response; 
相关问题