0

嘿,我正在处理一个 json 调用,它将用 json 实现 Drupal 的服务模块。我正在使用 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

drupalConnect不返回任何东西,success回调的返回也被丢弃。使用从 ajax 调用返回的数据的最佳方法是在回调本身中使用它。

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 回答
0

这是因为Asynchronousajax,让我详细说明,让session_id您进行 ajax 调用。目前它将发送请求,但它不会确保此时session_id将被分配。因此,当您进行第二次 ajax 调用时,session_id可能不会为值分配 。

有两种解决方法,

一个是,使用选项进行第一个 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"];
        }
    });
};

演示

第二种也是首选方式是使用延迟对象,例如

$.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 回答