web-dev-qa-db-ja.com

contentTypeを使用したAjax呼び出し: 'application / json'が機能しない

フォームデータをphp関数に送信するajax呼び出しがあります。 contentType: 'application/json'を使用することがベストプラクティスであることをよく読んだので、それも試してみたかったのです。しかし、残念ながら、スクリプトを使用しても何も返されません。それを削除すると、スクリプトは本来の動作を実行します。

理由は何か、そしてその理由は何か分かりますか?ありがとうございました!

$('#Form').submit(function(e) {
            e.preventDefault();

            var content = $(this).serialize() + "&ajax=1";

            $.ajax('app/class/controller/contactForm.php', {
              type: "POST",
              //contentType: 'application/json',
              dataType: 'json',
              data: content,
              success: function(result) {
                  console.log(result);
              }
            });
        })

と私のPHP:

if(isset($_POST['ajax']) && $_POST['ajax'] === '1') {
    echo json_encode(validateForm($_POST));
}
11
Sebsemillia

contentType: 'application/json'を使用する場合、$_POSTが入力されていることに依存することはできません。 $_POSTは、フォームでエンコードされたコンテンツタイプに対してのみ入力されます。

そのため、次のようにPHP raw入力からデータを読み取る必要があります。

$input = file_get_contents('php://input');
$object = json_decode($input);

もちろん、application/jsonを送信したい場合は、実際にはJSONを送信する必要がありますが、これは行っていません。オブジェクトのシリアル化をJSONに直接構築するか、次のようにする必要があります- jQueryを使用してフォームデータをJavaScriptオブジェクトに変換します -フォームからオブジェクトをシリアル化します。

正直なところ、フォームデータを扱っているので、application/jsonを使用するユースケースはあまりないと思います。

18
Mike Brant

参照するベストプラクティスは、サーバースクリプトがJSONのContent-Typeを「application/json」に設定することです。

Header('Content-Type: application/json; charset=UTF8');

これは、デフォルトのContent-Typeが送信され、多くの場合、キャッチオールtext/htmlが送信され、クライアントの理解につながる可能性があるためです。

JQueryリクエストでContent-Typeを指定しない場合、jQueryが最も適切なものを決定します。ここでの問題は、POSTフォームを送信していたことです。このフォームの場合、 jQuery によって設定されるデフォルトのContent-Typeapplication/x-www-form-urlencodedです。これは、PHPデータをPOSTフィールドとしてデコードし、$_POSTに入力するように指示します。スクリプトは$_POSTからパラメーターを回復します。 (または多分$_REQUEST)。

これをapplication/jsonに変更すると、$_POSTにデータが入力されなくなり、受信スクリプト操作は予期していたパラメーターを受信できなくなり、操作が中断します。

したがって、次のいずれかを行う必要があります。

  • 自分でコンテンツタイプを指定しないでください(より良い、私見)
  • content-Typeをapplication/x-www-form-urlencoded; charset=UTF-8に設定します
  • content-Typeをapplication/json; charset=UTF-8に設定し、スクリプトを変更してPOSTストリームを解析し、JSONデータをデコードします。 この回答 を参照してください。

3番目のオプションには、php://inputの-​​ 適切な処理 が必要です。

3
LSerni

PHPスクリプトはContent-Typeヘッダーを設定する必要があります。

if(isset($_POST['ajax']) && $_POST['ajax'] === '1') {
    header('Content-Type: application/json');
    echo json_encode(validateForm($_POST));
}
1
ceejayoz