【问题标题】:How to validate placeholders?如何验证占位符?
【发布时间】:2017-09-29 22:04:27
【问题描述】:

Placeholders 在 Mojolicious 中可用。

我们可以通过$c->param( 'placeholder_name' ) 访问它们作为来自用户$c->param( 'post_or_query_param' ) 的其他输入数据

但是当我们在验证后访问参数时,我们使用:

$c->validation->param( 'post_or_query_param' )

如果post_or_query_param 未通过验证,则返回undef

我们可以通过Restrective placeholders 部分验证占位符,但仍以$c->param( 'placeholder_name' ) 访问它们(因为占位符对验证对象不可用)

这常常导致程序员认为在这个代码位置没有使用经过验证的数据,因为经过验证的数据可以作为:$v->param( 'xxx' )

占位符是来自用户的相同输入作为查询或发布数据。

如何使占位符可用于验证对象?并以与其他验证数据相同的方式访问用户输入:

$v->param( 'validated parameter name' );

【问题讨论】:

  • 我不认为这样做是个好主意。这些占位符是 URL 的一部分。在某种程度上,它们是参数(或参数),但它们不是 form 参数,这就是 imho 的验证目的。也就是说,我认为您可以为验证对象提供任意哈希值,而不是依赖其获取 GET 和 POST 参数的内置魔法。
  • @simbabque:我认为,我们应该考虑到 form。查询可能是 jsonxml 并且在任何情况下数据都将由$v->param(...) 访问。表单验证是特殊情况。此行为不应被硬编码,并且必须在处理程序上中继。它基于Content-Type 标头调用。我考虑所有:URL、查询和 POST 正文,作为用户的输入

标签: perl mojolicious


【解决方案1】:

我找到了这个解决方案:将占位符放入->input

# GET /tariffs/:tariff_id
my $v =  $c->validation;

# Solution: how to make placeholder available to validation:
my $placeholders =  $self->match->stack->[-1];
@{ $v->input }{ keys %$placeholders } =  values %$placeholders;

# etc.
$v->required( tariff_id =>  [ data_exists =>  $self, '!Tariff' ] );
return ...   if $v->has_error;

my $tariff =  $v->param( 'tariff_id' );

【讨论】:

    【解决方案2】:

    通常我使用OpenAPI 插件并使用这种格式描述API。占位符参数也将通过架构进行验证(就像 Query/JSON/Form/XML 参数一样)。

    OpenAPI 验证器基于 JSON Schema Validator,功能丰富。支持最小值、最大值、模式、枚举、深层结构等。

    Read article about Mojolicious and OpenAPI.

    这里是example of validation schemacontroller

    【讨论】:

    • avoid link only answers。答案“仅仅是指向外部网站的链接”may be deleted
    • 查询没有问题。问题是关于占位符的。验证对象不可用
    • OpenAPI 也支持占位符参数验证。谢谢,已经解决了。
    猜你喜欢
    • 2023-03-25
    • 2011-07-09
    • 2011-05-23
    • 2012-04-02
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多