注文する
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
。
アプリケーションがデコードされない場合、パイプを介してカーリングにデータを渡す。