「@」で始まるcURLを使用してコンテンツを公開するには?

「@」で始まるcURLを使用してコンテンツを公開するには?

注文する

curl http://localhost/ --data @hello

ファイルから読み取ろうとしますhello。このシンボルをどのように回避できますか@

答え1

カールの内部についてもっと学ぶことなく、カールに直接パイプすることをお勧めします。

printf @hello | curl http://localhost/ --data @-

アノテーションで@ulrich-schwarzが提案したように、より便利な場合は --data @<(echo @hello)使用することもできます(すべてのシェルがこの構文をサポートしているわけではありません)。

@curl-7.41.0のソースコードを見ると、ファイル名として解釈されるのを防ぐためにシンボルをエスケープする方法はありません。

if('@' == is_file) {
  /* a '@' letter, it means that a file name or - (stdin) follows */

  if(curlx_strequal("-", p)) {
    file = stdin;
    set_binmode(stdin);
  }
  else {
    file = fopen(p, "rb");
    if(!file)
      warnf(config,
            "Couldn't read data from file \"%s\", this makes "
            "an empty POST.\n", nextarg);
  }

  /* ... */
}

したがって、残念ながら、私たちは上記のパイプラインソリューションに閉じ込められているようです。

答え2

データはコンテンツタイプとして送信されます。application/x-www-form-urlencoded。原則として、%40これにデコードする必要があるため、@次のコマンドは同等のデータを送信する必要があります。

curl http://localhost/ --data %40hello

ただし、これはサーバー側のアプリケーションが実際にURLデコードを実行しているかどうかに応じて機能する場合と動作しない場合があります。エンコードされていないデータが必要な場合(アプリケーションがデータに特殊文字を含めたくない場合は非常に一般的です)、アプリケーションはこれを%40hello

アプリケーションがデコードされない場合、パイプを介してカーリングにデータを渡す

答え3

カールからマニュアルページ:

--data-raw <data>

(HTTP)これはデータ公開に似ています-dが、--data@文字の特別な解釈はありません。

だからあなたの命令は次のようになります

関連情報