2011-05-28 83 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; 
相關問題