【问题标题】:cordova ios xmlhttprequest seems to cache responsecordova ios xmlhttprequest 似乎缓存响应
【发布时间】:2014-07-05 11:47:52
【问题描述】:

我有一个使用 XMLHTTPRequest 进行调用的 cordova ios 应用程序。情况是,我第一次使用正确的用户名/密码登录,应用程序按预期工作。注销后做了一些事情,我明确地尝试使用错误的用户名/密码登录。似乎它仍在让我登录。我什至提醒了服务器的响应,它正在返回以前的响应。

我已经准备好与我目前情况类似的其他线程,但是,我已经添加了这样的行:

“缓存控制:无缓存” “缓存控制:最大年龄=0” “编译指示:无缓存”

但没有一个有效。任何信息都会有帮助。谢谢。

【问题讨论】:

  • 你能提供你的代码吗?
  • 你好道森。谢谢回复。这是我的 XMLHTTPRequest 调用的 sn-p: var xmlhttp = new XMLHttpRequest(); xmlhttp.open(方法,url,false); xmlhttp.setRequestHeader("授权", "基本" + Base64.encode(accessInfo) ); xmlhttp.setRequestHeader("接受", "application/xml,application/atom+xml"); xmlhttp.setRequestHeader("Content-Type", "application/atom+xml");
  • 刚做了一些谷歌搜索,发现很多人都在使用缓存清除方法,即附加一个随机的get 变量或时间戳作为get 变量,如下所示:url + "?v=" + Math.random() 或我认为更好:url + "?t=" + (new Date()).getTime()
  • 你好道森。我也试过了。在我的变量 'url' 上,我这样做了: var n = new Date().getTime();然后在下一行 var url = baseurl + "?param=" + n.但仍然是相同的用例结果。我让我们的服务器管理员看看是否有办法在服务器端关闭某种会话或 cookie。这是一个很长的镜头,但我在这里没有想法了。我什至简化了登录逻辑,而不是在“按钮按下”时调用函数进行登录,而是直接执行 xmlhttprequest 连接以消除任何其他错误点。
  • 你会使用 jQuery 吗?问是因为我有一个 API 连接器对象,我为这种类型的东西编写了一直对我有用的东西,但它与 jquery 相关联。如果可以的话,我会把代码分享给你。

标签: javascript ios caching cordova xmlhttprequest


【解决方案1】:

这是一个已经被多次使用的解决方案,虽然它依赖于 jQuery:

var api = {
    connection: {
        baseUrl: '',
        apiUrl: ''
    },
    initialize: function() {
        api.setupAjaxDefaults();
    },
    setupAjaxDefaults: function() {
        var headers = {
            'Accept': "application/json; encoding='utf-8'",
            'Content-Type': "application/json; encoding='utf-8'"
        };
        $.ajaxSetup({
            headers: headers,
            dataType: 'json',
            crossDomain: true
        });
    },
    ajaxPost: function(methodName, data, successCallback, errorCallback) {
        $.ajax({
            url: api.connection.baseUrl + api.connection.apiUrl + methodName,
            data: data,
            type: 'POST',
            success: function(result, status, xhr) {
                if ($.isFunction(successCallback)) {
                    successCallback(result);
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                if ($.isFunction(errorCallback)) {
                    errorCallback();
                }
                else {
                    api.defaultErrorCallback(textStatus);
                }
            }
        });
    },
    ajaxGet: function(methodName, data, successCallback, errorCallback) {
        $.ajax({
            url: api.connection.baseUrl + api.connection.apiUrl + methodName,
            data: data,
            cache: false,
            type: 'GET',
            success: function(result, status, xhr) {
                if ($.isFunction(successCallback)) {
                    successCallback(result);
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                if ($.isFunction(errorCallback)) {
                    errorCallback();
                }
                else {
                    api.defaultErrorCallback(textStatus);
                }
            }
        });
    },
    ajaxGetCached: function(methodName, data, successCallback, errorCallback) {
        $.ajax({
            url: api.connection.baseUrl + api.connection.apiUrl + methodName,
            data: data,
            type: 'GET',
            success: function(result, status, xhr) {
                if ($.isFunction(successCallback)) {
                    successCallback(result);
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                if ($.isFunction(errorCallback)) {
                    errorCallback();
                }
                else {
                    api.defaultErrorCallback(textStatus);
                }
            }
        });
    },
    defaultErrorCallback: function(errorMsg) {
        //alert('an api error occurred: ' + errorMsg);
    }
};

首先填写connection 对象。 baseUrlhttp(s)://mydomain.tdlapiUrl 用于对 API 进行版本控制或分段,如果不需要,请将其设置为 / 否则用作 /myApiv1/

如果您需要BaiscAuth,请将username: someuserpassword: plaintextpassword 添加到方法ajaxSetup 中的ajaxSetup 对象setupAjaxDefaults

一旦您的应用程序触发deviceready 事件调用api.initialize();

然后使未缓存的请求使用:

api.ajaxGet('someEndpoint', { some: param, someother: data }, aSuccessCallbackFn, optionalFailureCallbackFn);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多