4

在 Zend Framework 2 中,如果 HTTP 接受标头设置为“application/json”,我想返回 JSON,否则返回 HTML。我正在使用新的acceptableViewModelSelector控制器插件,就像2.0.4 更改日志中的示例一样。

我有以下代码:

class IndexController extends AbstractActionController {
    private $acceptCriteria = array(
        'Zend\View\Model\JsonModel' => array('application/json'),
        'Zend\View\Model\FeedModel' => array('application/rss+xml')
    );

    public function jsonAcceptHeaderAction() {
        $view_model = $this->acceptableViewModelSelector($this->acceptCriteria);

        return $view_model;
    }
}

如果我像这样设置接受标头:

curl -H "Accept: application/json" http://mydomain.com/json

然后控制器插件JsonModel按预期返回一个实例。但是,它似乎总是这样做,即使application/json我的接受标题中没有。例如,如果我在 Chrome 中访问该页面,则会发送以下接受标头:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

如果我使用curl http://mydomain.com/json. 控制器插件有一个默认的视图模型名称,我希望它在找不到与我的接受标准匹配时使用。更改日志说明如下:

如果不满足条件,上面将返回标准 Zend\View\Model\ViewModel 实例,如果满足特定条件,则返回指定的视图模型类型。

我试图将我的接受标准更改为以下内容,结果证明这是我想要的。

private $acceptCriteria = array(
        'Zend\View\Model\ViewModel' => array('text/html'),
        'Zend\View\Model\JsonModel' => array('application/json'),
        'Zend\View\Model\FeedModel' => array('application/rss+xml')
    );

我只是想知道为什么在没有application/json接受标头时它不使用默认视图模型名称,因为理想情况下我想省略接受条件数组中的第一个条目。

有谁知道为什么我总是得到一个JsonModel对象,除非我做上面的改变?

4

1 回答 1

0

默认视图模型有效,您的代码没有问题,如果您没有text/html条目,如果您使用任何能够接受 json 的浏览器访问 url,则接受标准将与第一个条目匹配即应用程序/json。

要测试默认模型是否正常工作,请使用 curl 测试您的 url,如下所示,在接受视图模型数组中没有text/html条目,您将获得默认视图模型输出

curl -H "Accept: text/html" http://mydomain.com/json

这将返回默认视图模型,因此要按预期工作,您需要有一个条目text/html,将条目以您的首选顺序放置在数组中

于 2012-12-26T06:04:30.270 回答