Httpie: curlのようなraw本体に `-d、-data`オプションを追加するように要求します

作成日 2016年10月31日  ·  18コメント  ·  ソース: httpie/httpie

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 POST example.org <<< "foo bar"またはhttp POST example.org < file.nameを実行できます

全てのコメント18件

httpに-dオプションを追加することの何が問題になっていますか?

それには_特に_悪いことは何もないでしょう。 私はただ配管がきれいだと思っており、同じことをする方法が1つしかない場合に強く好みます。 パイピングはまさにこの目的(つまり、プログラムに_data_を渡すため)のために存在し、理解しやすく、普遍的で、明確です。 適切なCLIツールはすべて( curlを除いて)パイピングをサポートしているため、概念を1回だけ学ぶ必要があります。

比較:

httpie

要求データを渡すための一般的な方法は、リダイレクトされた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ツールが両方の方法をサポートしているため、両方の機能をサポートしても複雑さは増さないと思います。 例えば。 catgrepfindtail .. ..

あなたが言及するコマンドは、通常、ファイル名引数リストまたは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
このページは役に立ちましたか?
0 / 5 - 0 評価