【问题标题】:catalyst request object json input催化剂请求对象 json 输入
【发布时间】:2013-10-25 04:44:47
【问题描述】:

示例代码:

sub record_put :Private {
    my ( $self, $c, @args ) = @_;

    $c->log->info( join ', ', %{ $c->request->headers } ) ;
    $c->log->info( $c->request->body ) ;

    $c->response->body( $c->request->body ) ;
}

这是日志数据:

[info] user-agent, Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/28.0.1500.71 Chrome/28.0.1500.71 Safari/537.36, connection, keep-alive, accept, application/json, text/javascript, */*; q=0.01, accept-language, en-US,en;q=0.8, x-requested-with, XMLHttpRequest, origin, http://localhost:3000, accept-encoding, gzip,deflate,sdch, content-length, 125, host, localhost:3000, ::std_case, HASH(0xaec0ba0), content-type, application/json, referer, http://localhost:3000/test
[info] /tmp/PM2C6FXpcC

这是来自Catalyst::Request 文档的文本片段:

$req->body

Returns the message body of the request, as returned by HTTP::Body: a string, unless Content-Type is application/x-www-form-urlencoded, text/xml, or multipart/form-data, in which case a File::Temp object is returned.

File::Temp 联机帮助页没有帮助。即使“对象”重载了它的字符串化,我也看不到如何提取内容。

【问题讨论】:

  • 请注意,没有从 File::Temp 对象获取文件句柄的方法。对象本身充当文件句柄。对象 isa IO::Handle 和 isa IO::Seekable 所以所有这些方法都可用。
  • 答案正盯着我的脸。

标签: json catalyst


【解决方案1】:

这是我使用的:

  my $rbody = $c->req->body;
  if ($rbody) {
    # Post requests are stored on the filesystem under certain obscure conditions,                                                                           
    # in which case $rbody is a filehandle pointing to the temporary file      
    if (ref $rbody) {           # a filehandle                                 
      $content = join "", readline($rbody);
      close $rbody;
      unlink "$rbody";  # filehandle stringifies to name of temp file          
    } else {                    # a string                                     
      $content = $rbody;
    }
  }

您从body 方法返回的内容代表一个临时文件,可以将其视为文件句柄或字符串。如果你把它当作一个文件句柄,它会从临时文件中读取;如果像字符串一样使用,它的值是临时文件的名称。我使用了很少见的内置函数readline,它与更常见的<…> 运算符相同。

我不认为else 路径会被采用,但它是防御性的,因为你永远不知道。

2014-06-09 添加:您需要显式关闭;否则代码有文件描述符泄漏。 Catalyst 开发人员声称它应该自动清理句柄,但事实并非如此。

【讨论】:

    【解决方案2】:

    如果您只是想解析 JSON,最新的稳定版 Catalyst 有一个方法 'body_data' 可以为您执行此操作(请参阅:http://www.catalystframework.org/calendar/2013/6

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 2020-01-05
      • 2020-12-14
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      相关资源
      最近更新 更多