-4

URLを介してファイルを更新するために呼び出すことができるRESTAPIサーバーが必要です。それだけです。

ファイルは次のとおりです。

mytextfile:
       key1 = value1
       key2 = value2
  1. クライアントでは、1つまたは複数の文字列をAPIサーバーに送信するスクリプトが実行されます。
  2. たとえば、APIサーバーはそれらを受信します/update.script?string1="blah"&string2="fun"(URLエンコードされたふりをします)
  3. 次に、サーバーはこれらの文字列を解析してから、ファイルを更新するためにsedコマンドを実行するシステム上でもexec関数または別のスクリプトを呼び出す必要があります。

言語や実装は関係ありません。

新鮮なアイデアを探しています。

すべての提案をいただければ幸いです。

4

2 に答える 2

2

わからない: あなたの問題/質問は正確には何ですか?

「url エンコードされた引数を使用して cgi スクリプト内からファイルを変更する」という問題に対する私のアプローチは次のようになります。

  1. 好きな言語を選んでコーディングを始めましょう。私の場合は Perl です。

    #!/usr/bin/perl
    use strict; use warnings;
    
  2. すべての引数を取得します。ここでは PerlのCGIモジュールを使用します。

    use CGI::Carp;
    use CGI;
    my $cgi = CGI->new;
    
    # assuming we don't have multivalued fields:
    my %arguments = $cgi->Values; # handles (almost) *all* decoding and splitting
    # validate arguments
    # send back CGI header to acknowledge the request
    # the server will make a HTTP header from that
    
  3. 次に、特別なサブルーチン/関数を呼び出します...</p>

    updateHandler(%arguments);
    ...;
    my $filename = 'path to yer file name.txt';
    sub updateHandler {
       my %arguments = @_;
       # open yer file, loop over yer arguments, whatever
    
       # read in file
       open my $fileIn, '<', $filename or die "Can't open file for reading";
       my @lines = <$fileIn>;
       close $fileIn;
    
       # open the file for writing, completely ignoring concurrency issues:
       open my $fileOut, '>', $filename or die "Can't open file for writing";
    
       # loop over all lines, make substitutions, and print it out
       foreach my $line (@lines) {
          # assuming a file format with key-value pairs
          # keys start at the first column
          # and are seperated from values by an '=',
          # surrounded by any number of whitespace characters
          my ($key, $value) = split /\s*=\s*/, $line, 2;
    
          $value = $arguments{$key} // $value;
          # you might want to make sure $value ends with a newline
    
          print $fileOut $key, " = ", $value;
       }
    }
    

    安全性が低く、最適ではないコードを使用しないでください。これは実際には複雑ではないというデモンストレーションとして書いただけです。

  4. …または、引数を別のスクリプトに送信する方法を考案します (ただし、Perl はファイル操作タスクに適しています)。スクリプトから必要な出力に応じてqw{}systemまたはコマンドのいずれかを選択するか、 のモードを使用して引数をスクリプトにパイプすることを決定します。execopen my $fh, '|-', $commandopen

  5. このスクリプトを実行するサーバーについて: 非常に特別なニーズ (独自のプロトコル、シングルスレッド、低セキュリティ、低パフォーマンス) がない限り、Apache は私には問題ないように見えます。HTTP::Daemonモジュールを使用すると、単純なサーバーで 50 行未満を管理できます。

    Apache を使用する場合は、mod_rewrite を使用して を/path環境PATH_INFO変数に入れることを強くお勧めします。1 つのスクリプトを使用して REST API 全体を表す場合、 を使用しPATH_INFOて多くのメソッド/サブルーチン/関数の 1 つを選択できます。これにより、URL でスクリプトに名前を付ける必要もなくなります。

    たとえば、URL を

    http://example.com/rest/modify/filename?key1=value1
    

    の中へ

    /cgi-bin/rest-handler.pl/modify/filename?key1=value1
    

    $ENV{PATH_INFO}Perlスクリプト内では、/modify/filename.

これは少し Perl 中心ですが、使い慣れた言語を選んコーディングを開始し、途中で使用できるモジュールを活用してください。

于 2012-08-17T02:04:44.103 に答える
1

Mojoliciousのような新しい Perl フレームワークを使用します。ファイル ( test.pl) を作成する場合:

#!/usr/bin/env perl

use Mojolicious::Lite;
use Data::Dumper;

my $file = 'file.txt';

any '/' => sub {
  my $self = shift;
  my @params = $self->param;

  my $data = do $file;
  $data->{$_} = $self->param($_) for @params;

  open my $fh, '>', $file or die "Cannot open $file";

  local $Data::Dumper::Terse = 1;
  print $fh Dumper $data;

  $self->render( text => "File Updated\n" );
};

app->start;

次に実行しますmorbo test.pl

にアクセスhttp://localhost:3000/?hello=world(または実行./test.pl get /?hello=world)

それから私は入りますfile.txt

{
  'hello' => 'world'
}

等々。

于 2012-08-17T03:20:07.487 に答える