web-dev-qa-db-ja.com

file_get_contents( "php:// input")または$ HTTP_RAW_POST_DATA、どちらがJSONリクエストの本文を取得するのに適していますか?

file_get_contents("php://input")または$HTTP_RAW_POST_DATA-JSONリクエストの本文を取得するのにどちらが良いですか?

また、クライアント側GETを使用するときにJSONデータを送信するには、どのリクエストタイプ(POSTまたはXmlHTTPRequest)を使用する必要がありますか?

私の質問はこの答えからインスピレーションを受けました: JSONをPHPにcurlで投稿する方法

その答えから引用:

プロトコルの観点から見ると、file_get_contents("php://input")は実際にはもっと正確です。とにかく、実際にはhttpマルチパートフォームデータを処理していないからです。

108
Manuel Bitto

実際php://inputを使用すると、未加工のPOSTデータを読み取ることができます。

これは、$ HTTP_RAW_POST_DATAに代わるメモリ集約型ではなく、特別なphp.iniディレクティブを必要としません

php://inputenctype="multipart/form-data"では使用できません。

リファレンス:http://php.net/manual/en/wrappers.php.php

185
zaf

php:// inputはread-onlyストリームで、リクエスト本文から生データを読み取ることができます。 POSTリクエストの場合、特別なphp.iniディレクティブに依存しないため、$ HTTP_RAW_POST_DATAの代わりにphp:// inputを使用することをお勧めします。さらに、$ HTTP_RAW_POST_DATAがデフォルトで設定されていない場合、always_populate_raw_post_dataをアクティブ化するよりもメモリ消費量が少ない可能性があります。

ソース: http://php.net/manual/en/wrappers.php.php

13
Zeeshan Hyder

file_get_contents(php:// input)-生のPOSTデータを取得します。APIを記述し、$にデコードできないXML/JSON/...入力が必要な場合は、これを使用する必要があります_POST by PHPいくつかの例:

jSON文字列を送信する

<input type="button" value= "click" onclick="fn()">
<script>
 function fn(){


    var js_obj = {plugin: 'jquery-json', version: 2.3};

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax({
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data){
    console.log(data);
  }

});

    }
</script>

1.php

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));
9
zloctb

リクエストの送信方法には通常のルールが適用されます。リクエストが情報の取得(例:部分的な検索「ヒント」の結果、表示される新しいページなど)の場合、GETを使用できます。送信中のデータが何かを変更する要求(データベースの更新、レコードの削除など)の一部である場合、POSTを使用します。

サーバー側では、post/getデータブロック全体を一度に取得する場合を除き、生の入力を使用する理由はありません。通常どおり、_GET/_POST配列を使用して、必要な特定の情報を取得できます。 MooTools/jQueryなどのAJAXライブラリは、実際のAJAX呼び出しを実行し、フォームデータを適切な形式にエンコードするという難しい部分を処理します。

3
Marc B

2番目の質問は簡単です。GETには、サーバー側とブラウザー側の両方で1〜2キロバイトのサイズ制限があるため、POSTを介して送信する必要があるあらゆる種類の大量のデータです。

2
Pekka 웃

JSONデータの場合、「application/json」コンテンツタイプとしてPOSTする方がはるかに簡単です。 GETを使用する場合、パラメーター内のJSONをURLエンコードする必要がありますが、これはやや面倒です。また、POSTを行う際のサイズ制限はありません。非常に制限されている場合のGETのサイズ(最大4K)。

2
ZZ Coder