在 Zend Framework 2 中,如果 HTTP 接受 header 设置为“application/json”,我想返回 JSON,否则返回 HTML。我正在使用新的 acceptableViewModelSelector Controller 插件,就像在 example in the 2.0.4 changelog 中一样。 .
我有以下代码:
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;
}
}
如果我这样设置接受 header :
curl -H "Accept: application/json"http://mydomain.com/json
然后 Controller 插件按预期返回一个 JsonModel 实例。但是,它似乎总是这样做,即使在我的 accept header 中没有 application/json 时也是如此。例如,如果我在 Chrome 中访问该页面,则会发送以下接受 header :
接受:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
如果我使用 curl http://mydomain.com/json,我也会得到 JSON。 Controller 插件有一个默认的 View 模型名称,我希望它在找不到符合我的接受条件的匹配项时使用。变更日志说明如下:
The above would return a standard Zend\View\Model\ViewModel instance if the criteria is not met, and the specified view model types if the specific criteria is met.
我尝试将我的接受标准更改为以下内容,结果符合我的要求。
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 接受 header 时它不使用默认 View 模型名称,因为理想情况下我想省略接受条件数组中的第一个条目.
有谁知道为什么我总是得到一个 JsonModel 对象,除非我进行上述更改?
最佳答案
默认 View 模型有效,如果您没有 text/html 条目,如果您使用任何能够接受 json 的浏览器访问 url,则您的代码没有问题,接受条件将与第一个条目匹配,即 application/json。
要测试默认模型是否正常工作,请使用以下 curl 测试您的 url,而无需在 acceptableviewmodel 数组中输入 text/html,您将获得默认 View 模型输出
curl -H "Accept: text/html" http://mydomain.com/json
这将返回默认 View 模型,因此要按预期工作,您需要有一个条目 text/html,将条目按照您的首选顺序放入数组中
关于php - 基于 accept header 的 ZF2 返回格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14033353/
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s