0

ブラウザでリダイレクトURLとユーザーIDのパラメータを渡すことができます。これは、イントラネットアプリケーションです。したがって、「http:// intranetapp?redirect_url = http:// crapola&userid = xxxxxxx」などのアドレスを貼り付けることができます。これにより、そのURLにリダイレクトされ、ユーザーIDの追加情報が提供されます。これは、数百回取得したいものです。情報はリダイレクトされるパラメーターの一部として返されます。これをajaxまたはjqueryの関連メソッドで呼び出し(GETリクエスト)、返されたhtmlを取得するだけでなく、返されたURLとパラメーターを読み取る方法はありますか?

4

2 に答える 2

1

クリス、私の理解が正しければ、あなたがやりたいことはややトリッキーです。

私はこの種のことをする必要はありませんでしたが、原則として、それには異常なタイプの ajax リクエスト、つまり「HEAD」リクエストが含まれていることを知っています。 HTTP 応答 (本文)。

イントラネット サーバーは HEAD 要求を処理する必要がありますが (少なくとも GET と同じくらい安全です)、必ずしもそうとは限りません。そうでない場合は、サーバー管理者に相談してください。あなたがサーバー管理者である場合は、httpd.confファイルおよび/または適切な.htaccessファイル (Apache を想定) にルートがあります。

すべてのタイプの ajax と同様に、コードの一部を (サーバーからの HTTP 応答が戻ってきたときに) 非同期で実行する必要があるため、コードも注意が必要です。これを支援するために、jQuery の Deferreds/Promises を (自由に) 使用できます。

あなたの主なワーカー関数(私が正しく理解していれば)は次のようになります:

function getUserParams(userID) {
    var $ = jQuery,
        dfrd = $.Deferred(),
        q = {},
        baseURL = 'http://intranetapp?redirect_url=http://crapola&userid=';
    $.ajax({
        type: "HEAD",
        url: baseURL + userID,
        cache: false,
        success: function(data, textStatus, jqXHR) {
            var location = jqXHR.getResponseHeader('Location');
            if(location){
                var search = $("<a>").attr('href', location).get(0).search.replace(/^[?]/, ''),
                    prop, pair;
                if (search) {
                    $.each(search.split("&"), function(i, arg) {
                        pair = arg.split("=");
                        if (pair.length >= 1) {
                            prop = pair.shift();
                            q[prop] = (pair.length == 1) ? pair[0] : (pair.length > 1) ? pair.join('=') : '';
                        }
                    });
                }
                //At this point q is a hash representing parameters in the location's search string.
                dfrd.resolve(userID, q);
            }
            else {
                dfrd.reject(userID, 'No redirect url in the response');
            }
        },
        error: function(jqXHR, textStatus, errorThrown) {
            dfrd.reject(userID, 'Ajax failure: ' + textStatus + ': ' + errorThrown);
        }
    });
    return dfrd.promise();
}

ajax は非同期であるため、実際に必要な結果ではなく promise を返すことに注意してください。それらは後で到着し、javascript プレーン オブジェクトにパッケージ化されますq

テスト方法は次のgetUserParams()とおりです。

var userID = '12345678';
getUserParams(userID).done(function(userID, q) {
    //Work with userID and q as required
    console.log(['Success', userID, q.fullname, q.status, q.postalcode].join(': '));//for example
}).fail(function(userID, message) {
    //Handle error case here
    message = message || ''; 
    console.log(['Error', userID, message].join(': '));//for example
});

何百もの URL を使用する場合の使用目的は、次のようになります。

var userIDs = [
    //array of userIDs (hard coded or otherwise constructed)
    '1234',
    '5678'
];
var promises = [];
$.each(userIDs, function(i, userID) {
    var p = getUserParams(userID).done(function(userID, q) {
        //work with userID and q as required
        $("<p/>").text([userID, q.fullname, q.status, q.postalcode].join(': ')).appendTo($("#results"));//for example
    }).fail(function(userID, message) {
        //handle error case here
        message = message || ''; 
        console.log(['Error', userID, message].join(': '));//for example
    });
    promises.push(p);
});

また、すべての ajax リクエストへの応答が受信されたときに何かをしたい場合もあります。その場合、追加のコードは次のようになります。

$.when.apply(null, promises).done(function() {
    //Do whatever is required here when ALL ajax requests have successfully responsed.
    //Note: any single ajax failure will cause this action *not to happen*
    //alert('All user data was gathered');
    console.log('All user data was gathered');
}).fail(function() {
    //Do whatever is required here when ALL ajax requests have responsed.
    //Note: any single ajax failure will cause this action *to happen*
    //alert('At least one set of user data failed');
    console.log('At least one ajax request for user data failed');
}).then(function() {
    //Do whatever is required here when ALL ajax requests have responsed.
    //Note: This function will fire after either the done or fail function.
    //alert('Gathering of user data complete, but not necessarily successfully');
    console.log('Gathering of user data complete, but not necessarily successfully');
});

Location一部テスト済み (コードは実行されますが、リダイレクトまたはヘッダーの処理をテストする手段がありません)。

qオブジェクト内のユーザー データを正確に使用し、エラーを適切に処理するには、コード [の一部のサブセット] を微調整する必要があります。

于 2012-12-06T23:55:03.960 に答える
0

この関数は役立ちます

function getUrl() {
    var args = {};                             // Start with an empty <a title="object" href="http://muraliprashanth.me/category/javascript/object/">object</a>
    var query = location.search.substring(1);  // Get query string, minus '?'
    var pairs = query.split('&amp;');              // Split at ampersands
    for(var i = 0; i &lt; pairs.length; i++) {    // For each fragment
        var pos = pairs[i].indexOf('=');       // Look for 'name=value'
        if (pos == -1) continue;               // If not found, skip it
        var name = pairs[i].substring(0,pos);  // Extract the name
        var value = pairs[i].substring(pos+1); // Extract the value
        value = decodeURIComponent(value);     // Decode the value
        args[name] = value;                    // Store as a property
    }
    return args;                               // Return the parsed arguments
}
于 2012-12-06T05:58:52.300 に答える