0

サンプルコード:

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役に立ちません。「オブジェクト」でさえ文字列化をオーバーロードしているため、コンテンツを抽出する方法がわかりません。

4

2 に答える 2

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と同じです。<…&gt;

私はその道がたどられるとは思っていませんが、elseあなたが決して知らないので、それは防御的にそこにあります.

2014-06-09 追加: 明示的な終了が必要です。そうしないと、コードにファイル記述子のリークがあります。Catalyst 開発者は、ハンドルを自動的にクリーンアップする必要があると主張していますが、そうではありません。

于 2014-02-06T19:31:15.200 に答える