基于accept报头的ZF2返回格式


ZF2 return format based on accept header

在Zend框架2中,如果HTTP接受头被设置为"application/JSON "和HTML,我想返回JSON。我正在使用新的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;
    }
}

如果我这样设置accept报头:

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

我也得到JSON返回如果我使用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对象,除非我做上面的改变?

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

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

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

这将返回默认视图模型,因此要像您期望的那样工作,您需要有一个条目text/html,将条目按照您喜欢的顺序放置在数组中