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


120

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

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

私の質問はこの回答から発想を得ました: curlを使用してJSONをPHPに投稿する方法

その答えからの引用:

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

回答:


195

実際にphp://input生のPOSTデータを読み取ることができます。

これは、$ HTTP_RAW_POST_DATAの代わりにメモリをあまり必要としない代替手段であり、特別なphp.iniディレクティブを必要としません

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

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


12
また、PHP 5.6以降$HTTP_RAW_POST_DATAは非推奨と見なされ、php://input再利用できます。
Chris Forrence 2014

もご覧くださいenable_post_data_reading
Pacerier、2015

json_decode(file_get_contents( 'php:// input')、true)これはPHP 7.1でサポートされ、URLから$ _GET値を取得しますか?
2018

$ HTTP_RAW_POST_DATAはPHP 7で非推奨になりました
Daniel

15

php:// inputは、リクエストの本文から生データを読み取ることができる読み取り専用ストリームです。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


4
また、PHP 5.6以降$HTTP_RAW_POST_DATAは非推奨と見なされ、php://input再利用できます。
Chris Forrence 2014

14

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

投稿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'));

3

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

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


それがポイントです。JSONは変数のない形式であるため、1回の実行でpost / getデータブロック全体を取得したいのですが、JSONはデータのみを表します。
Manuel Bitto、2010

@Kucebeなぜこれが必要なのかわからないので、JSONデータをPOSTフィールドに入れて、それを使ってみませんか?
ペッカ

JSONブロック全体が必要な場合は、JSONテキストブロックをフォームフィールドに割り当てて、そのように送信してみませんか?<input type="hidden" name="data" value="json data here" />完全に受け入れ可能であり、$ _ REQUEST ['data']を使用してサーバーサイドで簡単に取得できます。
Marc B

3
POSTフィールドにJSONを埋め込むと、HTTP content-typeタグの目的が損なわれ、Fiddlerやブラウザーデバッガー(JSONを理解できる)でのデバッグにはあまり良くありません。また、多くのサードパーティJavaScriptライブラリは、JSONペイロードをapplication / jsonとしてPOSTします。
Cyber​​Monk 2013年

2

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


2
多くの場合、POSTにはサイズ制限がありますが、通常はかなり高く設定されています。を確認してくださいphp.ini
ブラッド、

2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.