无法使用 Cake 在 HTTP 响应中设置自定义状态代码消息 PHP
Can't set custom status code message in HTTP Response with Cake PHP
我想修改控制器方法中的响应。我想出了如何更改状态代码,但我无法更改消息。
API 表示为 httpCodes
方法提供一个数组,其中对于每个代码,我们要设置的消息。这是我的代码:
$this->response->statusCode(400);
$this->response->httpCodes(array(400 => 'Origin Denied'));
return $this->response;
我得到 Bad Request
而不是 Origin Denied
。
我也试过直接这样设置页眉:
$this->response->header("HTTP/1.0 500 Invalid file name.");
或
$this->response->header("HTTP/1.0", "500 Invalid file name.");
但我明白了
"HTTP/1.0 500 Invalid file name." is not valid header name : InvalidArgumentException
我正在吃蛋糕 PHP 3.3 和 PHP 7.1。这样做的目的是在我的网站上上传媒体并取回带有文件位置的 JSON 结构,或者如果失败则取回适当的代码。这是 TinyMCE 的要求。
我是 CakePHP 和 Response class 的初学者,我读了这本书和 API,但我仍然不知道该怎么做。
首先,你提供的link是给Cake2的,不是3
对于状态代码,400
代码与消息 Bad request
相关联,您无法更改它。
和headers是这样设置的,其中$header的前缀是X-
$this->response->header($header, $valueOfTheHeader);
首先我想指出这样的要求似乎很不方便。如果期望响应具有 JSON 格式的正文,则可以在其中轻松定义自定义原因短语。
Response::httpCodes()
仅适用于 "old" 前端控制器
也就是说,通常这是可能的,但是当使用 CakePHP 3.3 引入的 PSR 兼容 request/reponse 组件时,目前不直接支持,因为自定义原因短语不会传递给 PSR兼容响应。使用 3.3 之前的调度机制,它仍然可以工作,但是,检查 "old" 应用程序模板前端控制器(webroot/index.php
文件)。
从 3.4 开始可以再次轻松完成
从 CakePHP 3.4 开始,Response::httpCodes()
已弃用,并将在 4.0 中删除。同样从 3.4 开始,CakePHP 响应 class 将完全兼容 PSR-7,并且您将能够通过 Response::withStatus()
方法使用自定义原因短语设置状态,例如
return $this->response->withStatus(400, 'Bad Origin');
请记住 PSR-7 兼容的响应对象是不可变的!即,如果您希望在控制器中修改 $this->response
以供进一步使用,则必须覆盖它,例如:
$this->response = $this->response->withStatus(/* ... */);
在 3.3/3.4 转换中需要 "workaround"
在 3.3 和 3.4 之间的过渡中,当使用 PSR 兼容的前端控制器时,您可以通过覆盖 Application::__invoke()
添加对自定义原因短语的支持(Application
class 文件是默认位于您的应用 src
文件夹中。
您必须重新实现 BaseApplication::__invoke()
代码,并传递从 Response::httpCodes()
获得的原因短语,类似于:
use Cake\Http\RequestTransformer;
use Cake\Http\ResponseTransformer;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
// ...
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
{
$cakeRequest = RequestTransformer::toCake($request);
$cakeResponse = ResponseTransformer::toCake($response);
$cakeResponse = $this->getDispatcher()->dispatch($cakeRequest, $cakeResponse);
$psrResponse = ResponseTransformer::toPsr($cakeResponse);
$status = $psrResponse->getStatusCode();
$httpCodes = $cakeResponse->httpCodes($status);
if ($httpCodes !== null && isset($httpCodes[$status])) {
return $psrResponse->withStatus($status, $httpCodes[$status]);
}
return $psrResponse;
}
另见
我想修改控制器方法中的响应。我想出了如何更改状态代码,但我无法更改消息。
API 表示为 httpCodes
方法提供一个数组,其中对于每个代码,我们要设置的消息。这是我的代码:
$this->response->statusCode(400);
$this->response->httpCodes(array(400 => 'Origin Denied'));
return $this->response;
我得到 Bad Request
而不是 Origin Denied
。
我也试过直接这样设置页眉:
$this->response->header("HTTP/1.0 500 Invalid file name.");
或
$this->response->header("HTTP/1.0", "500 Invalid file name.");
但我明白了
"HTTP/1.0 500 Invalid file name." is not valid header name : InvalidArgumentException
我正在吃蛋糕 PHP 3.3 和 PHP 7.1。这样做的目的是在我的网站上上传媒体并取回带有文件位置的 JSON 结构,或者如果失败则取回适当的代码。这是 TinyMCE 的要求。
我是 CakePHP 和 Response class 的初学者,我读了这本书和 API,但我仍然不知道该怎么做。
首先,你提供的link是给Cake2的,不是3
对于状态代码,400
代码与消息 Bad request
相关联,您无法更改它。
和headers是这样设置的,其中$header的前缀是X-
$this->response->header($header, $valueOfTheHeader);
首先我想指出这样的要求似乎很不方便。如果期望响应具有 JSON 格式的正文,则可以在其中轻松定义自定义原因短语。
Response::httpCodes()
仅适用于 "old" 前端控制器
也就是说,通常这是可能的,但是当使用 CakePHP 3.3 引入的 PSR 兼容 request/reponse 组件时,目前不直接支持,因为自定义原因短语不会传递给 PSR兼容响应。使用 3.3 之前的调度机制,它仍然可以工作,但是,检查 "old" 应用程序模板前端控制器(webroot/index.php
文件)。
从 3.4 开始可以再次轻松完成
从 CakePHP 3.4 开始,Response::httpCodes()
已弃用,并将在 4.0 中删除。同样从 3.4 开始,CakePHP 响应 class 将完全兼容 PSR-7,并且您将能够通过 Response::withStatus()
方法使用自定义原因短语设置状态,例如
return $this->response->withStatus(400, 'Bad Origin');
请记住 PSR-7 兼容的响应对象是不可变的!即,如果您希望在控制器中修改 $this->response
以供进一步使用,则必须覆盖它,例如:
$this->response = $this->response->withStatus(/* ... */);
在 3.3/3.4 转换中需要 "workaround"
在 3.3 和 3.4 之间的过渡中,当使用 PSR 兼容的前端控制器时,您可以通过覆盖 Application::__invoke()
添加对自定义原因短语的支持(Application
class 文件是默认位于您的应用 src
文件夹中。
您必须重新实现 BaseApplication::__invoke()
代码,并传递从 Response::httpCodes()
获得的原因短语,类似于:
use Cake\Http\RequestTransformer;
use Cake\Http\ResponseTransformer;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
// ...
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
{
$cakeRequest = RequestTransformer::toCake($request);
$cakeResponse = ResponseTransformer::toCake($response);
$cakeResponse = $this->getDispatcher()->dispatch($cakeRequest, $cakeResponse);
$psrResponse = ResponseTransformer::toPsr($cakeResponse);
$status = $psrResponse->getStatusCode();
$httpCodes = $cakeResponse->httpCodes($status);
if ($httpCodes !== null && isset($httpCodes[$status])) {
return $psrResponse->withStatus($status, $httpCodes[$status]);
}
return $psrResponse;
}