设置响应状态码

100

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

由于这是一个API,所以我真正想要做的就是设置响应状态并退出,并使用一个简单的愚蠢消息解释请求失败的原因(可能使用exit)。只需要完成任务,但我无法使其正常工作。我尝试使用PHP的header()和Cake的$this->header()(这都在控制器中),但是虽然我得到了退出消息,但标头显示200 OK状态。

使用下面的代码,我得到了消息,但是标头没有设置。我缺少什么?

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

140

1
有趣。我从未见过这种用法,但手册肯定支持你的观点。对我来说,这似乎是一种更好的方法。 - Wesley Murch
值得受到惩罚的耳光。我在匆忙中完全忽略了显而易见的事情,感谢你们纠正我。 - Rob Wilkerson
1
@Brad,在Ubuntu上安装Apache。PHP帮助文档实际上说:“请注意,仅当字符串不为空时,此参数才有效。”而我让它起作用的唯一方法是加上desc。我正在使用AJAX调用,所以这可能与此有关。无论如何,现在对我有效。 - Stephen RC
@Brad,我的Web服务器拦截所有输出以自动启用传输编码,如果输出超过8k字节。换句话说,我可以简单地强制响应为HTTP/1.0或HTTP/1.1。有没有办法在不修改HTTP版本的情况下简单地设置响应代码和消息? - Pacerier
5
建议使用HTTP/1.1协议。从PHP 5.4开始,您可以使用http_response_code()函数设置响应状态码,这是最佳方法。否则,您需要将状态码附加到某个标头中。您可以使用类似于header('X-Ignore-This: something', true, 401)的方式来实现。 - Brad
显示剩余3条评论

131

自从PHP 5.4版本以后,您可以使用http_response_code函数。

http_response_code(404);

这将处理设置正确的HTTP头。

如果您运行的是PHP <5.4,则有两个选项:

  1. 升级。
  2. 使用在PHP中实现的http_response_code函数

3
为了提供最新的答案,因为这个问题是最热门的结果之一。 - Jason McCreary

12

我认为你没有正确设置header,可以尝试这样:

header('HTTP/1.0 401 Unauthorized');

12

为什么不使用Cake Response Class呢? 你可以通过以下方式简单地设置响应状态码:

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

然后只需使用最适合JSON的错误消息文件进行渲染。


在提问时还没有2.x版本。 - mark
啊,抱歉。没有注意到。是我的错。 - rookian
在那一行之前加上这个,否则会出错:$this->autoRender = false; - Scott L

5

我遇到了与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 和错误描述文本之间放置了一个冒号(:)。

-2

如前所述,但对于像我这样的初学者,请不要忘记包括返回值。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接