【问题标题】:Can't set custom status code message in HTTP Response with Cake PHP无法使用 Cake PHP 在 HTTP 响应中设置自定义状态代码消息
【发布时间】:2017-01-25 16:16:39
【问题描述】:

我想修改控制器方法中的响应。我想出了如何更改状态码,但我无法更改消息。 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 

我正在使用 Cake PHP 3.3 和 PHP 7.1。这样做的目的是在我的网站上上传媒体并返回带有文件位置的 JSON 结构,或者如果失败,则返回适当的代码。这是 TinyMCE 的要求。

我是 CakePHP 和 Response 类的初学者,我阅读了这本书和 API,但我仍然不知道该怎么做。

【问题讨论】:

    标签: php http cakephp cakephp-3.3


    【解决方案1】:

    首先我想指出,这样的要求似乎相当不便。如果期望响应具有 JSON 格式的正文,则可以在其中轻松定义自定义原因短语。

    Response::httpCodes() 仅适用于“旧”前端控制器

    话虽如此,这通常是可能的,但是当使用 CakePHP 3.3 引入的 PSR 兼容请求/响应组件时,目前不直接支持,因为自定义原因短语不会传递给 PSR 兼容响应。使用 3.3 之前的调度机制,它仍然可以工作,但请检查“旧”应用程序模板前端控制器(webroot/index.php 文件)。

    从 3.4 开始可以再次轻松完成

    从 CakePHP 3.4 开始,Response::httpCodes() 已弃用,并将在 4.0 中删除。同样从 3.4 开始,CakePHP 响应类将完全兼容 PSR-7,您将能够通过 Response::withStatus() 方法使用自定义原因短语设置状态,例如

    return $this->response->withStatus(400, 'Bad Origin');
    

    请记住,兼容 PSR-7 的响应对象是不可变的!即,如果您希望修改控制器中的$this->response 以供进一步使用,则必须覆盖它,例如:

    $this->response = $this->response->withStatus(/* ... */);
    

    在 3.3/3.4 转换中需要“解决方法”

    在 3.3 和 3.4 之间的转换中,当使用 PSR 兼容的前端控制器时,您可以通过覆盖 Application::__invoke() 来添加对自定义原因短语的支持(Application 类文件默认位于您的应用程序 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;
    }
    

    另见

    【讨论】:

    • 那是一个地狱般的回应。感谢您进一步解释:)
    • 赞成发现 $this->response 是不可变的:$this->response = $this->response->withStatus(/* ... */);
    【解决方案2】:

    首先,您提供的链接是针对 Cake2,而不是 3

    对于状态码,400 代码与消息 Bad request 相关联,您无法更改它。

    并且header是这样设置的,其中$header前缀为X-

    $this->response->header($header, $valueOfTheHeader);
    

    【讨论】:

    • 糟糕,我的错。但它是一样的。是的,我知道并且我尝试了很多事情,但我仍然无法更改消息。使用$this->response->header("HTTP/1.0", "500 Invalid file name."); 我得到"HTTP/1.0" is not valid header name 。有没有办法更改消息?
    • 我不知道。这是有效的 http 标头列表en.wikipedia.org/wiki/List_of_HTTP_header_fields
    • 您可以设置自定义标题,方法是在它们前面加上X- 示例$this->response->header('X-customeheader', 'Some value');
    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2021-05-31
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多