如何在Apigility ApiProblem响应中启用Json pretty print?

时间:2016-02-28 23:37:01

标签: json rest zend-framework2 apigility hal-json

我想知道默认情况下如何将ApiProblem响应设置为漂亮的打印Json。

2 个答案:

答案 0 :(得分:0)

在ZF-Hal中有一个HalJsonStrategy用于渲染。这个策略extends the default ZF2 JsonStrategy。此策略将类型为HalJsonModel which extends的视图模型呈现为默认的ZF2 JsonModel类。 使用the HalJsonRenderer which extends默认的ZF2 JsonRenderer类进行渲染。

您可以通过将渲染策略更改为某个自定义策略或通过在HalJsonStrategy内设置另一个渲染器(扩展现有渲染器的自定义渲染器)来自定义所有这些。

不确定什么是最好的方法。
由于所有这些hal-json渲染逻辑都是在默认的ZF2 json渲染逻辑之上构建的,因此可以通过改变配置来改变当前渲染器输出json的方式,就像在ZF2中通常所做的那样打印输出。

也许这个页面here将帮助您实现您想要的目标。

要点:

归结为将the render method in the JsonRenderer class(或渲染通话)中的Json::encode来电与Json::prettyPrint

进行交换

注意: 这可能是因为这样做是为了在浏览器窗口中以可读的方式查看您的json代码。有许多json插件可以帮助你解决这个问题,它将是一个更容易的解决方案。

答案 1 :(得分:0)

我在课程ApiProblemResponse上做了一些更改。我将属性$jsonFlags设置为 128 ,这与JSON_PRETTY_PRINT代码相关。

以下是我的更改的完整类代码:

<?php

namespace Zend\ApiProblem;

use Zend\Http\Response;

/**
 * Represents an ApiProblem response payload
 */
class ApiProblemResponse extends Response
{
    /**
     * @var ApiProblem
     */
    protected $apiProblem;

    /**
     * Flags to use with json_encode JSON_PRETTY_PRINT
     *
     * @var int
     */
    protected $jsonFlags = 128;

    /**
     * @param ApiProblem $apiProblem
     */
    public function __construct(ApiProblem $apiProblem)
    {
        $this->apiProblem = $apiProblem;
        $this->setCustomStatusCode($apiProblem->status);
        $this->setReasonPhrase($apiProblem->title);

        // Just comment/remove these lines to prevent flags from being overwrited
        //if (defined('JSON_UNESCAPED_SLASHES')) {
          //$this->jsonFlags = constant('JSON_UNESCAPED_SLASHES');
        //}
    }

    /**
     * @return ApiProblem
     */
    public function getApiProblem()
    {
        return $this->apiProblem;
    }

    /**
     * Retrieve the content
     *
     * Serializes the composed ApiProblem instance to JSON.
     *
     * @return string
     */
    public function getContent()
    {

        return json_encode($this->apiProblem->toArray(), $this->jsonFlags);
    }

    /**
     * Retrieve headers
     *
     * Proxies to parent class, but then checks if we have an content-type
     * header; if not, sets it, with a value of "application/problem+json".
     *
     * @return \Zend\Http\Headers
     */
    public function getHeaders()
    {
        $headers = parent::getHeaders();
        if (!$headers->has('content-type')) {
            $headers->addHeaderLine('content-type', 'application/problem+json');
        }
        return $headers;
    }

    /**
     * Override reason phrase handling
     *
     * If no corresponding reason phrase is available for the current status
     * code, return "Unknown Error".
     *
     * @return string
     */
    public function getReasonPhrase()
    {
        if (! empty($this->reasonPhrase)) {
            return $this->reasonPhrase;
        }

        if (isset($this->recommendedReasonPhrases[$this->statusCode])) {
            return $this->recommendedReasonPhrases[$this->statusCode];
        }

        return 'Unknown Error';
    }
}

我使用的控制器内部:

return new ApiProblemResponse(
  new ApiProblem(ApiProblemResponse::STATUS_CODE_501, 'Example of JSON_PRETTY_PRINT response.')
);

做了诀窍:

{
    "type": "http:\/\/www.w3.org\/Protocols\/rfc2616\/rfc2616-sec10.html",
    "title": "Not Implemented",
    "status": 501,
    "detail": "Example of JSON_PRETTY_PRINT response."
}