11

CakePHP が受け取るべき情報を投稿するために、knockout.js フォームで AJAX を使用していますが、Cake は何も見つけられないようです。また、POST からの 200 ステータス (OK) にもかかわらず、アラートは表示されません。

ここにAJAXがあります

$.ajax({  
          url: "/orders/finalize_payment",  
          type: "POST",  
          dataType: "json",  
          contentType: "json",  
          data: JSON.stringify({"customer": customer_id}),  
          success: function(){              
            alert("success");  
          }
    }); 

これは、注文コントローラーの対応するアクションです。今、私はそれを最小限に完全に剥ぎ取りました.

function finalize_payment($id = null){
    $this->layout = false;
    $this->autoRender = false;
    if($this->request->is('post')){ //the user has submitted which status to view
        print_r($this->request->data);
            echo "test"; //just to make sure it's reaching this point
    }
}

クロムでネットワークタブを開くと、リクエストペイロードが次のように表示されます

customer: 1

POST は成功、ステータス 200 として表示されます。応答ヘッダーを確認したところ、表示されるだけです。

array
(
)
test

ペイロードが送信されていることをクロムが示しているにもかかわらず、CakePHP は明らかにそれを見つけていません。

アップデート

リクエストを AJAX から $.post に変更したところ、うまくいきました。理由はまだわかりません

$.post("/orders/finalize_payment",{"customer_id":customer_id},function(data){
        alert('success');
 });
4

6 に答える 6

17

投稿データを json としてエンコードしない

問題のコードは、どの php スクリプトにも表示されません。その理由は次のとおりです。

contentType: "json"

これは form-url-encoded リクエストではないため、たとえば次のコード:

print_r($_POST);
print_r(file_get_contents('php://input'));

出力します:

Array()
'{"customer":123}'

データを json として送信する場合は、生のリクエスト ボディを読み取る必要があります。

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

それが望ましい場合もありますが (API の使用)、通常の使用方法ではありません$.post

通常の方法

データを送信する通常の方法は、jQuery にエンコードを任せることです。

$.ajax({  
    url: "/orders/finalize_payment",  
    type: "POST",  
    dataType: "json",  // this is optional - indicates the expected response format
    data: {"customer": customer_id},  
    success: function(){              
       alert("success");  
    }
});

これにより、投稿データが送信され、コントローラーapplication/x-www-form-urlencodedで使用できるようになります。$this->request->data

$.post が機能する理由

リクエストを AJAX から $.post に変更したところ、うまくいきました。理由はまだわかりません

あなたが持っている質問の更新されたコードで暗黙的に:

  • JSON.stringify 呼び出しを削除しました
  • jsonの提出から提出に変更application/x-www-form-urlencoded

そのため、それは機能せず、$.post機能$.ajaxしませんでした($.post実際には単に呼び出します$.ajax)-結果の呼び出しのパラメーターが$.ajax質問の構文で正しいということです。

于 2013-07-18T20:31:01.143 に答える
2

CakePHP を使用していると、コンポーネントに RequestHandler を追加すると問題が解決することがあります。

public $components = array([snip], 'RequestHandler');

これにより、$this->request->data を使用して JSON 投稿データに透過的にアクセスできるようになりました。Angularなどの特定のJSフレームワークがJSONをデフォルトとして投稿することを考えると、JSONとしてPOSTデータをエンコードしないという他の回答のアドバイスは少し厄介になります。

于 2014-08-22T08:32:33.360 に答える
2

生データとjsonを使用すると、次を使用できます。

$data = $this->request->input('json_decode');

**データは配列ではなくオブジェクトになりました。

次に、次を使用できます。

  $this->MyModel->save($data).
于 2015-06-22T20:47:42.650 に答える
1

きれいにフォーマットされた質問:)

私は間違っているかもしれませんが、私は答えを持っていると確信しています...基本的に、$this->requestはCakeのオブジェクトで$this->request->dataあり、オブジェクトのプロパティである変数/配列です。

dataCake に送信するデータは、配列ではなくオブジェクトに直接送信されます (可能であれば) 。これが、Cake が HtmlHelper を使用してフォームを生成するときに、名前がたとえばdata[User][username].

配列に入れて送信JSON.stringify({"customer": customer_id})すればうまくいくと思います。'data'

于 2013-07-18T19:50:33.820 に答える
0

この投稿を見てください。あなたのデータ文字列はおそらく正しくありません。そのため、CakePHP はそれを に入れることができない場合があります$this->request->data

于 2013-07-18T20:32:02.473 に答える