设置响应状态代码 [重复]

Posted

技术标签:

【中文标题】设置响应状态代码 [重复]【英文标题】:Set Response Status Code [duplicate] 【发布时间】:2011-09-04 01:44:15 【问题描述】:

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

因为它是一个 API,所以我真正想做的就是设置响应状态并退出一个关于请求失败原因的简单、愚蠢的消息(可能使用exit)。足以完成工作,但我无法让它正常工作。我尝试过使用 phpheader() 和 Cake 的 $this->header()(这一切都在控制器中),但是虽然我收到了退出消息,但标题显示了 200 OK 状态。

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

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

【问题讨论】:

【参考方案1】:

PHP

header() 函数有一个状态码参数。如果您指定它,服务器将从那里处理它。

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

PHP >=5.4

查看 Gajus 的回答:https://***.com/a/14223222/362536

【讨论】:

有趣。我从来没有见过这个使用,但手册当然同意你的看法。这对我来说是一种更好的方法。 值得一记惩罚性的耳光。我在匆忙中完全错过了显而易见的事情。谢谢你们让我直截了当,伙计们。 我发现您需要将状态描述放入第一个参数中才能使其正常工作... @Brad,Ubuntu 上的 Apache。 PHP帮助文档实际上说:“请注意,此参数仅在字符串不为空时才有效。”,我让它工作的唯一方法是将 desc 放入。我正在使用 AJAX 调用,所以这可能有关系。不管怎样,它现在对我有用。 你应该使用HTTP/1.1。现在,从 PHP 5.4 开始,您可以使用http_response_code() 来设置代码。这是最好的方法。否则,您必须将其附加到某个标题。你总是可以做类似header('X-Ignore-This: something', true, 401)【参考方案2】:

从 PHP 5.4 开始,您可以使用http_response_code。

http_response_code(404);

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

如果您运行的是 PHP

    升级。 使用在 PHP 中实现的this http_response_code function。

【讨论】:

+ 提供更新的答案,因为这个问题是最佳结果之一。【参考方案3】:

我认为您没有正确设置 header,试试这个:

header('HTTP/1.0 401 Unauthorized');

【讨论】:

【参考方案4】:

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

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

然后只需渲染一个带有错误消息的文件,这最适合 JSON。

【讨论】:

提问时还没有 2.x 啊,对不起。没注意到。我的错。 一直出错,直到我在该行之前添加了这个 $this->autoRender = false;【参考方案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 没有错误或警告。

*edit:在最后的$this->header函数调用中,我在400和错误描述文本之间加了一个冒号(:)。

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于设置响应状态代码 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 中使用自定义代码进行响应 [重复]

PayPal IPN 交付状态设置为“重试”,HTTP 响应代码为 404

如何设置(Rust)Rocket API 端点的模板响应的 HTTP 状态代码?

从 <img> 标签获取 HTTP 状态代码或响应标头?

进度指示器的状态没有变化[重复]

如何删除这个 Jason 响应(时间戳、状态、错误、路径)?我只想获取对象数据[重复]