curl
のように生データを渡すオプションを追加するだけで、リクエストは簡単です。
http :/api/user -d 'MyRawData...'
ほとんどの場合、JSONまたはフォームデータを送信する場合は、次のような_ "リクエストアイテム" _で実現できることを知っています。
http :/api/hey say=Hello to=me …
そして、それはコンテンツタイプに応じて適切なフォーマットに変換されます、それは素晴らしいです! また、送信するJSONまたはフォームデータではないものがある場合は、次のようにすることができます。
echo 'MyRawData...' | http :/api/hey
しかし、これは実用的ではなく、HTTPieの主なアイデアは_人間のためのcURLのようなツール_であり、この場合はその原則からはほど遠いです。実際、 curl
は前の例のHTTPieよりも実用的です。 複数のコマンドを追加し、 |
<
のような醜い文字でそれらをパイプするのは、単純なオプションが欠落しているという理由だけで、_人間に優しい_ようには聞こえません。
-d
オプションをhttp
に追加することの何が問題になっていますか?
httpに-dオプションを追加することの何が問題になっていますか?
それには_特に_悪いことは何もないでしょう。 私はただ配管がきれいだと思っており、同じことをする方法が1つしかない場合に強く好みます。 パイピングはまさにこの目的(つまり、プログラムに_data_を渡すため)のために存在し、理解しやすく、普遍的で、明確です。 適切なCLIツールはすべて( curl
を除いて)パイピングをサポートしているため、概念を1回だけ学ぶ必要があります。
比較:
要求データを渡すための一般的な方法は、リダイレクトされたstdin(標準入力)を使用することです。 このようなデータはバッファリングされ、リクエスト本文として使用される処理は行われません。
-d, --data <data>
(HTTP) Sends the specified data in a POST request to the HTTP server, in the same way that a browser
does when a user has filled in an HTML form and presses the submit button. This will cause curl to pass
the data to the server using the content-type application/x-www-form-urlencoded. Compare to -F,
--form.
-d, --data is the same as --data-ascii. --data-raw is almost the same but does not have a special
interpretation of the @ character. To post data purely binary, you should instead use the --data-binary
option. To URL-encode the value of a form field you may use --data-urlencode.
If any of these options is used more than once on the same command line, the data pieces specified will
be merged together with a separating &-symbol. Thus, using '-d name=daniel -d skill=lousy' would gener-
ate a post chunk that looks like 'name=daniel&skill=lousy'.
If you start the data with the letter @, the rest should be a file name to read the data from, or - if
you want curl to read the data from stdin. Multiple files can also be specified. Posting data from a
file named 'foobar' would thus be done with --data @foobar. When --data is told to read from a file
like that, carriage returns and newlines will be stripped out. If you don't want the @ character to
have a special interpretation use --data-raw instead.
はい、コマンドラインツールでの配管のサポートは優れた機能であることに同意します。また、配管をサポートするコマンドラインツール( Mongotail )を作成しました。正直なところ、 curl
それをサポートしていません。 しかし、Unixエコシステムのほとんどすべての既知のCLIツールが両方の方法をサポートしているため、両方の機能をサポートしても複雑さは増さないと思います。 例えば。 cat
、 grep
、 find
、 tail
.. ..
あなたが言及するコマンドは、通常、ファイル名引数リストまたはstdin
を介した生の入力データのいずれかを受け入れます。 ただし、実際のデータを引数として受け入れないでください。 引数を介して生データを受け入れることは非常にまれです。
(以前のコメントで書いたことを明確にする: curl
はstdinをサポートしますが、たとえば--data-binary @-
で読み取るように明示的に指示する必要があります。)
この問題に関連するバグを報告するためにここに来たので、おそらくそれはバグではなく、設計どおりに機能しています。
「curl」の代わりに「httpie」を使用するように変更したbashスクリプトがあります。 リクエストは、httpサーバーへの空のPOSTです。 このスクリプトをdocker exec -i ${container} bash -x
にパイプして実行します。
http POST
コマンドは、対話型シェルから実行すると正常に機能していましたが、スクリプトがすぐに終了する原因になっていることを理解するのに苦労しました。
docker exec
でstdinを読み取るhttp
についての何かだと思います。 これを回避するために「 echo -n
」をパイプする必要があるのは奇妙に思えます。
#!/bin/bash
echo "STARTING..."
echo -n | http POST ... # this replaces: curl -XPOST --data-binary '' ...
echo "Without the 'echo -n' above this statement would not be reached."
echo "DONE"
( @jamshid you POST
http POST httpbin.org/post
だけで空の本文。スクリプトでのHTTPieの使用の詳細についてお読みください— --ignore-stdin
オプションを含めたい場合。これは無関係の問題です。ただし、必要に応じて、ここに返信するのではなく、新しい問題を開いてください。)
ファイル名からの15.1リクエストデータがこの問題の元のリクエストをカバーしていると私は考えていますか? この問題は解決できると思います。
余談ですが、XMLファイルの改行が保持されなかった理由を3時間ほど回避できたので、昨日までにHTTPieについて知っていればよかったのですが。 (これは私のアプリだと思っていましたが、カールでした。データをそのままにしておくには、 --data-binary
オプションを使用する必要があります。)HTTPieに感謝します。
@DavidOliverではありません。 @mrsarmは、ファイルの内容ではなく、パラメーターから文字列を渡すことができるように要求しました。
+1
この機能@jakubroztocilでMRを受け入れますか?
http POST example.org <<< "foo bar"
またはhttp POST example.org < file.name
を実行できます
http:/ api / hey say = Hello to = me…
http POST example.org <<< "foo bar"
またはhttp POST example.org < file.name
を実行できます
PowerShellでは機能しないようでした。 'raw body data' | http post :8080/api/events
はPowerShellで機能しました。
それでも、生のボディデータを転送するために-d, --data
またはこのようなものが必要です
ドキュメントによると、「Bashhere文字列」を使用できます。
http example.com/ <<<'{"name": "John"}'
UIに関しては、このオプションは理にかなっています。
空のjsonオブジェクト( {}
)を送信する方法が見つからないようです。これは奇妙ですが有効なユースケースです。
@minusf :奇妙ですが有効なユースケースである空のjsonオブジェクト(
{}
)を送信する方法が見つからないようです。
$ echo '{}' | http httpbin.org/post
リダイレクト中に改行を破棄する方法はありますか?
$ echo 20 | http POST httpbin.org/post
提出されるデータは"data": "20\n"
になります
@hahattan echo
に、末尾の改行文字を-n
で印刷しないように指示できます。
$ echo -n foo | http httpbin.org/post
最も参考になるコメント
http POST example.org <<< "foo bar"
またはhttp POST example.org < file.name
を実行できます