次のように、JQueryを使用してWebページからJSONデータを送信しようとしています:
$.ajax({
type: "post", // Request method: post, get
url: "http://localhost/ajax/login",
data: '{username: "wiiNinja", password: "isAnub"}',
dataType: "json", // Expected response type
contentType: "application/json",
cache: false,
success: function(response, status) {
alert ("Success");
},
error: function(response, status) {
alert('Error! response=' + response + " status=" + status);
}
});
Cake2.2 には、次のように「login」という名前のメソッドを持つ Ajax という名前のコントローラーがあります。
public function login($id = null)
{
if ($this->RequestHandler->isAjax())
{
$this->layout = 'ajax'; // Or $this->RequestHandler->ajaxLayout, Only use for HTML
$this->autoLayout = false;
$this->autoRender = false;
$response = array('success' => false);
$data = $this->request->input(); // MY QUESTION IS WITH THIS LINE
debug($data, $showHTML = false, $showFrom = true);
}
return;
}
コントローラーに正しいデータを渡しているかどうかを確認したいだけです。この行を使用する場合:
$data = $this->request->input();
デバッグ プリントアウトが表示されます。
{username: "wiiNinja", password: "isCool"}
CakePHP マニュアル 2.x の「Accessing XML or JSON data」の下を読みましたが、データをデコードするための次の呼び出しが提案されています。
$data = $this->request->input('json_decode');
print $data をデバッグすると、「null」が表示されます。私は何を間違っていますか?Javascript から渡されたデータは間違っていますか? または、デコードを正しく呼び出していませんか?
提案をありがとう。
============= 自分の編集 ========
実験で自分の間違いを見つけました:
Javascript で投稿する場合、次の行の代わりに:
data: '{username: "wiiNinja", password: "isAnub"}',
次のように変更します。
data: '{"username": "wiiNinja", "password": "isAnub"}',
と
コントローラ コードで、次の行を変更します。
$data = $this->request->input('json_decode');
に:
$data = $this->request->input('json_decode', 'true');
できます。
ダンハムズズ、
あなたの提案に従い、コントローラーコードの「$this->request->params」配列を調べると、次のものが含まれています。
array(
'plugin' => null,
'controller' => 'ajax',
'action' => 'login',
'named' => array(),
'pass' => array(),
'isAjax' => true
)
ご覧のとおり、探しているデータはありません。私はすでに適切なルートコードを取得しています。これは、2.x のドキュメントに記載されている内容と一致しています。
http://book.cakephp.org/2.0/en/controllers/request-response.html
これまでのところ、それを機能させる唯一の方法は、上記の「自分の編集」で述べたとおりです。しかし、JSon 文字列をサーバーに送信するのが適切でない場合は、これを修正したいと思います。最終的には、JSON オブジェクトを送信するサード パーティのコードを処理する必要があるからです。