8

次のように、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 オブジェクトを送信するサード パーティのコードを処理する必要があるからです。

4

1 に答える 1

1

データに苦労している理由は、適切な javascript オブジェクト (JSON) ではなく、jQuery で文字列を送信しているためです。

$.ajax({
    type: "post",       // Request method: post, get
    url: "http://localhost/ajax/login",
    data: {username: "wiiNinja", password: "isAnub"}, // outer quotes removed
    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);
    }
});

これで、データは で PHP 配列として使用できるようになります$this->request->params

また、JSON レスポンスの送信については、このマニュアル ページ を参照してください。そこにあるコードのほとんどは、わずか 2 行に減らすことができます...

//routes.php
Router::parseExtensions('json');

//Controller that sends JSON
$this->set('_serialize', array('data'));
于 2012-07-12T09:21:22.663 に答える