2016-04-16 9 views
4

javacriptのfetch()を使用してデータを送信しています。

fetch('/string.php', { 
     method: 'post', 
     body: JSON.stringify({ 
     name: 'helloe world', 
     }) 
    }) 
    .then(function(response) { 
     if (response.status >= 200 && response.status < 300) { 
     return response.text() 
     } 
     throw new Error(response.statusText) 
    }) 
    .then(function(response) { 
     console.log(response); 
    }) 

string.phpファイルが含まれています

print_r($_POST); 

を今私の問題は$_POST戻り空の配列です。ファイルを添付してこれを修正することができます:

$_POST = json_decode(file_get_contents('php://input'), true); 

しかし、それは非常にハックを感じ、理想的ではありません。これはJS fetch()から投稿データを取得する際のPHPの意図した動作ですか?

とにかく内容が自動的に$_POSTに入れられることはありますか?

+0

私には正しいと思われますが、複数の部分からなるフォームデータではなく、文字列のリクエスト本文を送信しています。 – Scuzzy

+0

'json.stringify'を削除するのは、php://の入力を解析するよりも面倒ではありません –

答えて

6

$_POSTは、application/x-www-form-urlencodedまたはmultipart/form-data要求によってのみ設定されます。

その他のデータ形式の場合は、php://inputを手動で解析する必要があります。あなたのケースでは、json_decodeを使用し、結果を$_POSTスーパーグローバルに入れています。これは、JSONからフォームデータに「変換」するのに許容される方法です。

+0

最初の文を改行する必要があります。私にはかなり間違って聞こえる(それは正しいが、それはひどく言われている)。 ;) –

2

しかし、それは非常にハックを感じ、理想的ではありません。

$_POSTに割り当てるのは少し奇妙です。一般的に読み取り専用として扱われます。ほとんどの人は別の変数を使用します。

要求にContent-Typeを設定する必要があります。fetchは、特に指定しない限り、文字列がプレーンテキストであると主張してデフォルトになります。

これは、JS fetch()からポストデータを取得するときのPHPの意図した動作ですか?

いいえPHPがリクエストボディのコンテンツタイプをサポートしていない場合の意図した動作です。

私は$ _POST内にコンテンツを自動的に入れることがありますか?

JSONエンコードされたデータではなく、エンコードされたデータまたはマルチパートのデータを送信します。

+0

'$ _POST'はいつから読み込み専用ですか?あなたがおそらく変数自体が読み込み専用ではないことを意味したのではないかと思いますが、ほとんどの人は '$ _POST'変数やその内容をオーバーライドせず、新しい変数に代入します。 –

+0

@CharlotteDunois - そういうわけで、私は「扱われた」と言っていて、 – Quentin

関連する問題