web-dev-qa-db-ja.com

CURLOPT_POSTとCURLOPT_POSTFIELDS:CURLOPT_POSTオプションは必要ですか?

PHPのcURLが初めてです。 curlオプションの使用に関して質問があります。

ルートwwwにあるtest1.phpとtest2.phpの2つのスクリプトファイルを検討します。 buntu 12.04 LTSを使用しています。 PHP=のlibcurlバージョンは7.22.です。

test1.phpの内容

<?php
    $ch = curl_init();
    $post_data = array(
        'firstname' => 'John',
        'lastname' => 'Doe'
    );
    curl_setopt($ch, CURLOPT_URL, 'localhost/test2.php');
    curl_setopt($ch, CURLOPT_POST, TRUE);   //is it optional?
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_exec($ch);
    curl_close($ch);
?>

test2.phpの内容

<?php 
    var_dump($_POST);
?>

ブラウザでtest1.phpを実行すると、投稿された結果を見ることができます。 CURLOPT_POSTを含むcurlオプションを削除しても、例は機能します。 CURLOPT_POSTをfalseに設定しても、投稿が実行され、結果が表示されます。それで、CURLOPT_POSTはまったく必要ないのでしょうか?オプションCURLOPT_POSTFIELDSは、CURLOPT_POSTオプションを使用せずに[〜#〜] post [〜#〜]を介してデータを送信します。 test2.phpで$_SERVERを印刷すると、要求メソッドは常にPOSTに設定されます(オプションCURLOPT_POSTの有無にかかわらず)。

CURLOPT_POSTオプションの正確な使用方法を教えてください。 POST経由でデータを送信するために必要ですか?

19
Sanjay Maurya

あなたは正しいです。 CURLOPT_POSTFIELDSは、CURLOPT_POSTを意味します。 CURLOPT_POSTFIELDSを使用している間は、CURLOPT_POSTを使用する必要はありません。この場合、リクエストメソッドは常にPOSTに設定されます。

これは、[〜#〜] post [〜#〜]リクエスト

なりたくない場合は、[〜#〜] post [〜#〜]request、ただしCURLOPT_POSTFIELDSを設定します。関連するQ&Aを参照してください。

24
Niklesh_Chauhan

将来の参照のために、APIドキュメントはCURLOPT_POSTについてこう述べています


概要:

trueパラメーターは、ライブラリに通常のHTTPポストを実行するよう指示します。これにより、ライブラリは「Content-Type:application/x-www-form-urlencoded」ヘッダーを使用します。 (これは、最も一般的に使用されるPOSTメソッド)です。

CURLOPT_POSTFIELDSオプションを使用して、送信するデータを指定し、CURLOPT_POSTFIELDSIZEを使用してデータサイズを設定します。オプションで、CURLOPT_READFUNCTIONおよびCURLOPT_READDATAオプションを使用してPOSTにデータを提供できます。

CURLOPT_HTTPHEADERで独自に設定することで、デフォルトのPOST Content-Type:ヘッダーを上書きできます。

POSTをHTTP 1.1で使用すると、「Expect:100-continue」ヘッダーの使用が暗示されます。通常どおりCURLOPT_HTTPHEADERでこのヘッダーを無効にできます。

POSTをHTTP 1.1サーバーに使用する場合、チャンクエンコードを使用する場合、POST=を開始する前にサイズを知らなくてもデータを送信できます。これを有効にするには、CURLOPT_HTTPHEADERで「Transfer-Encoding:chunked」などのヘッダーを追加します。HTTP1.0またはチャンク転送なしで、リクエストでサイズを指定する必要があります。

POSTリクエストを発行し、代わりにHEADまたはGETを行いたい場合、CURLOPT_NOBODYを使用して新しいリクエストタイプを明示的に選択するか、 CURLOPT_HTTPGETなど。


CURLOPT_POSTを試行するように設定すると、CURLOPT_HTTPHEADERの「Content-Type:application/json; charset = utf-8」の設定がオーバーライドされるかどうかを現在テスト中です。

0
mreinsmith