0

Drupal のサービス モジュールを json で実装する json 呼び出しに取り組んでいます。jquery の ajax 関数を使用して関数を呼び出していますが、パラメーターが渡されていないというエラーが表示されます。投稿されているクエリ文字列を見ると、パラメーターが含まれているにもかかわらず、sessid が渡されていないことがわかります。以下は私が実行しているものです。

// JavaScript Document
$(document).ready(function() {

    function drupalConnect(src) {
        $.ajax({
            url: src,
            type: 'POST',
            data: {
                method: 'system.connect'
            },
            success: function(data) {
                return data["result"]["sessid"];
            }
        });
    }

    function getTimestamp() {
        return Math.round((new Date).getTime() / 1000);
    }

    function randString(length) {
        var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
        var randomstring = '';
        for (var i = 0; i < length; i++) {
            var rnum = Math.floor(Math.random() * chars.length);
            randomstring += chars.substring(rnum, rnum + 1);
        }
        return randomstring;
    }


    var session_id = drupalConnect('http://localhost/drupal/services/json-rpc');
    var nonce = randString(10);
    var timestamp = getTimestamp();
    var username = "markusgray";
    var password = "Markus1990";
    var key = '2ae0392e0aebbfeeddefcc962ea1924f';
    var domain = 'localhost';

    var hashObj = new jsSHA(timestamp + ";" + domain + ";" + nonce + ";user.login", "TEXT");
    var hash = hashObj.getHMAC(key, "TEXT", "SHA-256", "HEX");

    var parameters = {
        hash: hash,
        domain_name: domain,
        domain_time_stamp: timestamp,
        nonce: nonce,
        sessid: session_id,
        username: username,
        password: password
    };

    var par = JSON.stringify(parameters);

    $.ajax({
        url: 'http://localhost/drupal/services/json-rpc',
        type: 'POST',
        dataType: 'json',
        data: {
            method: 'user.login',
            params: par
        },
        success: function() {

        }
    });
});​
4

2 に答える 2

0

これは、Asynchronousajax が原因で、詳しく説明しsession_idますが、ajax 呼び出しを行っていることを取得します。現時点ではリクエストを送信しますが、session_idその時点で が割り当てられることは保証されません。したがって、2 番目の ajax 呼び出しを行うときに、session_idが値に割り当てられない場合があります。

これには 2 つの回避策があります。

1 つは、オプションを使用して最初の ajax 呼び出しを行いasync:false、成功呼び出し内で値を割り当てることです。

var session_id;

function drupalConnect(src) {
    $.ajax({
        url: src,
        type: 'post',
        async : false,
        data: {
            method: 'system.connect'
        },
        success: function(data) {
            session_id = data["result"]["sessid"];
        }
    });
};

デモ

2番目の推奨される方法は、遅延オブジェクトの使用、次のようなものです

$.when(
    // make your first ajax request
).then(function(data) {
    session_id = data["result"]["sessid"];
    // make your second ajax call
});​

デモ

于 2012-08-22T08:14:54.813 に答える
0

drupalConnect doesn't return anything, also the return from the success callback is just thrown away. The best way to use the data returned from an ajax call is to use it in thee callback itself.

function drupalConnect(src){
    $.ajax({
        url: src,
        type: 'POST',
        data:{method:'system.connect'},
        success: function(data){
            var session_id = data["result"]["sessid"]; 
            //use session_id here
        }
    });
}
于 2012-08-22T00:41:51.813 に答える