web-dev-qa-db-ja.com

Curlを使用してGETおよびPOSTリクエストを送信するにはどうすればよいですか?

パラメータgimmeflagおよび値pleaseを含むGETおよびPOSTリクエストを、コマンドラインでcurlを使用してURL http://103.200.7.150:7777/に送信するにはどうすればよいですか?

1
raka widiana

チュートリアルや本を読んでいるように見えますが、これは基本を理解したかどうかをテストするための生意気な方法です。

Curlまたはブラウザ経由で http://103.200.7.150:7777/ を呼び出すと、次の出力が生成されます。

リクエストメソッドGETとPOSTをパラメーター「gimmeflag」と値「please」とともに送信してください

curlman 1 curl または curl manual を参照)でどのように処理されるかを知りたいので、2つの部分に分けましょう。

GETを使用してリクエストを送信する:

query-string がどのように見えるかを知っていれば、これは非常に簡単です。

World Wide Webでは、クエリ文字列は、階層パス構造にうまく収まらないデータを含むUniform Resource Locator(URL)の一部です。通常、クエリ文字列には、たとえばHTMLフォームの一部として、Webブラウザまたは他のクライアントアプリケーションによってベースURLに追加されたフィールドが含まれます。

Webサーバーは、URLパスに基づいてファイルシステムからファイルを読み取るか、リソースのタイプに固有のロジックを使用して要求を処理することにより、ハイパーテキスト転送プロトコル要求を処理できます。特別なロジックが呼び出される場合、クエリ文字列は、URLのパスコンポーネントとともに、そのロジックで使用できます。( source

パラメーターgimmeflagと値pleaseを送信します。したがって、curlで要求する行は次のとおりです。

curl -X GET http://103.200.7.150:7777/?gimmeflag=please

サーバーから返される結果:

KSL {n0w_y0u_Know_How_To

POSTを使用してリクエストを送信します:

GET行を指定すると、POSTも非常に簡単です。GETをPOSTに置き換えるだけです。

curl -X POST http://103.200.7.150:7777/?gimmeflag=please

サーバーから返される結果:

_S3nD_r3quesT_Meth0d_GET_AND_POST}

これを結論付けるには:

# Thanks to @pa4080 for this line
printf '%s%s\n' \
"$(curl -X GET http://103.200.7.150:7777/?gimmeflag=please 2>/dev/null)" \
"$(curl -X POST http://103.200.7.150:7777/?gimmeflag=please 2>/dev/null)"

KSL {n0w_y0u_Know_How_To_S3nD_r3quesT_Meth0d_GET_AND_POST}

5
Videonauth

この回答は、 @ Videonauthの回答の結果を達成する方法を示していますが、wgetを使用しています。

$ wget -qO- http://103.200.7.150:7777/ 
Please send me request method GET and POST with params "gimmeflag" and value "please"
$ wget -qO- http://103.200.7.150:7777/?gimmeflag=please # GET is the default request
KSL{n0w_y0u_Know_How_To
$ wget -qO- --post-data '' http://103.200.7.150:7777/?gimmeflag=please # Simple POST req.
_S3nD_r3quesT_Meth0d_GET_AND_POST}
$ printf '\n%s%s\n' \
"$(wget -qO- http://103.200.7.150:7777/?gimmeflag=please 2>/dev/null)" \
"$(wget -qO- --post-data '' http://103.200.7.150:7777/?gimmeflag=please 2>/dev/null)"

KSL{n0w_y0u_Know_How_To_S3nD_r3quesT_Meth0d_GET_AND_POST}

man wget から:

-O file; --output-document=file - The documents will not be written to the appropriate 
     files, but all will be concatenated together and written to file. If '-' is used 
     as file, documents will be printed to standard output, disabling link conversion...

-q; --quiet - Turn off Wget's output.

--post-data=string; --post-file=file - Use POST as the method for all HTTP requests 
     and send the specified data in the request body. --post-data sends string as data, 
     whereas --post-file sends the contents of file. Other than that, they work in 
     exactly the same way. In particular, they both expect content of the form 
     "key1=value1&key2=value2", with percent-encoding for special characters... 
     Only one of --post-data and --post-file should be specified... This example shows 
     how to log in to a server using POST and then proceed to download the desired pages, 
     presumably only accessible to authorized users:

         # Log in to the server.  This can be done only once.
         wget --save-cookies cookies.txt --post-data 'user=foo&password=bar' \
         http://example.com/auth.php
2
pa4080

コメントするのに十分な担当者がいないため、ここで回答します。 2つの答えがあり、最も投票された答えはHTTPプロトコルの仕組みを知りません。

POSTデータは、URLではなく、HTTPペイロードの本体で送信されます。 URL内のクエリ文字列は、データを送信するためのアクションではないGETを介してデータを送信するための単なるトリックです(GETおよびPOSTは自明です)。

POSTでcurlを使用する正しい方法は次のとおりです。

curl -X POST -d "gimmeflag=please" http://103.200.7.150:7777/

GET変数とPOST変数が分離されている言語で実装されたスクリプトをテストすると、curl -X POST http://103.200.7.150:7777/?gimmeflag=pleaseはGET変数が見つかった変数を保存します。

1