2014-10-01 4 views
3

В моем веб-приложении я отправляю запрос POST на URL-адрес /navigate.php. Его работа такая, как должна.Запросы AJAX POST, которые кэшируются

Проблема в том, что это веб-приложение также должно работать в автономном режиме. Я должен показать уведомление, когда запрос не может быть завершен из-за проблем с подключением, и пользователь может снова синхронизироваться, когда проблемы будут устранены.

Когда я отключил подключение к Интернету для целей отладки, я обнаружил, что запрос все еще возвращается с кодом состояния 200 каждый раз.

Я ошибаюсь, что запрос POST не предполагается кэшировать браузером?

После поиска в режиме переполнения стека я попробовал решения, написанные здесь.

Я приложил кэш-адрес (new Date().getTime()) к URL-адресу, но никаких изменений не было. Запросы по-прежнему возвращаются с 200.

Я попытался отправить следующие заголовки с сервера (PHP/Ubuntu):

header("Expires: Sat, 01 Jan 2005 00:00:00 GMT"); 
header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT"); 
header("Cache-Control: no-cache, no-store"); 
header("Pragma: no-cache"); 

Я не с помощью JQuery для AJAX (как я должен был бы только используйте его для AJAX, ничего больше), иначе я бы использовал его опцию cache и установил его на false. Но я думаю, что он делает то же самое, добавьте кэш-адрес к URL-адресу.

Я использую следующий код для отправки запроса:

define([],function(){ 

var a=[ 

    function(){return new XMLHttpRequest()}, 
    function(){return new ActiveXObject("Msxml2.XMLHTTP")}, 
    function(){return new ActiveXObject("Msxml3.XMLHTTP")}, 
    function(){return new ActiveXObject("Microsoft.XMLHTTP")} 

]; 

    var o=function(){ 

     var r=false; 

     for(var i=0;i<a.length;i++) { 

      try{ 

       r=a[i](); 

      } catch(e) { 

       continue; 

      } 

      break; 

     } 

     return r; 

    }; 

    var verifyParam = function(param) { 
     if(typeof param === "undefined" || param === null) { 
      return false; 
     } else { 
      return true; 
     } 
    }; 

    var checkParam = function(param,defaultValue) { 
     if(!verifyParam(param)) { 
      return defaultValue; 
     } else { 
      return param; 
     } 
    }; 

    var generateCacheBust = function() { 
     return (new Date().getTime()); 
    }; 

    var request = function(url,method,dataInPost,initCallback,callback,error) { 

     var req = o(); 

     if(!req) return false; 

     initCallback = checkParam(initCallback,function(){}); 

     callback = checkParam(callback,function(){}); 

     error = checkParam(error,function(){}); 

     initCallback(req); 

     req.open(method,url,true); 

     if(dataInPost) { 

      req.setRequestHeader('Content-type','application/x-www-form-urlencoded'); 

     } 

     req.onreadystatechange = function() { 

      if(req.readyState!=4) { 

       return; 

      } 

      try { 

       if(req.status!=200 && req.status!=304) { 

        error(req.status); 

        return; 

       } else { 

        callback(req); 

       } 

      } catch (e) { 

       error(req.status); 

       return; 

      } 

     } 

     if(req.readyState == 4) return; 

     try { 

      req.send(dataInPost); 

     } catch (e) { 

      error(req.status); 

      return; 

     } 

    }; 

    var dataToString = function(data) { 

     var string = ''; 

     for(var key in data) { 

      string += (encodeURIComponent(key)+'='+encodeURIComponent(data[key])+'&'); 

     } 

     return string.substring(0,string.length-1); 

    } 

    var formattedResponse = function(req,type) { 

     var responseData = req.responseText; 

     if(type=="json") { 

      return JSON.parse(responseData); 

     } else { 

      return responseData; 

     } 

    } 

    var get = function(params) { 

     if(!verifyParam(params.url)) { return false; } 

     params.data = checkParam(params.data,{}); 

     params.responseType = checkParam(params.responseType,'text'); 

     params.init = checkParam(params.init,function(){}); 

     params.success = checkParam(params.success,function(){}); 

     params.error = checkParam(params.error,function(){}); 

     params.cache = checkParam(params.cache,true); 

     if(!params.cache) {params.data.cacheBust = generateCacheBust();} 

     request(params.url+'?'+dataToString(params.data),"GET",false,params.init,function(req){ 

      params.success(formattedResponse(req,params.responseType)); 

     },params.error); 

    }; 

    var post = function(params) { 

     if(!verifyParam(params.url)) { return false; } 

     params.data = checkParam(params.data,{}); 

     params.responseType = checkParam(params.responseType,'text'); 

     params.init = checkParam(params.init,function(){}); 

     params.success = checkParam(params.success,function(){}); 

     params.error = checkParam(params.error,function(){}); 

     params.cache = checkParam(params.cache,true); 

     if(!params.cache) {params.url += "?" + "cacheBust=" + generateCacheBust();} 

     request(params.url,"POST",dataToString(params.data),params.init,function(req){ 

      params.success(formattedResponse(req,params.responseType)); 

     },params.error); 

    }; 

    return { 

     get:get, 

     post:post 

    }; 

}); 

На сетевом журнале (Firefox), вот заголовки, показанные поджигатель

заголовков запроса:

POST /explorer/ajax/navigate.php?cacheBust=1412147821832 HTTP/1.1 
Host: genortal.com 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Referer: http://genortal.com/dashboard.php 
Content-Length: 12 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 

Ответные заголовки:

HTTP/1.1 200 OK 
Date: Wed, 01 Oct 2014 07:17:01 GMT 
Server: Apache/2.4.7 (Ubuntu) 
X-Powered-By: PHP/5.5.9-1ubuntu4.3 
Expires: Sat, 01 Jan 2005 00:00:00 GMT 
Cache-Control: no-cache, no-store 
Pragma: no-cache 
Last-Modified: Wed, 01 Oct 2014 07:17:02GMT 
Content-Length: 744 
Keep-Alive: timeout=5, max=79 
Connection: Keep-Alive 
Content-Type: application/json 

А вот заголовки, которые я получаю, когда я отключил интернет-соединение:

заголовков запроса:

POST /explorer/ajax/navigate.php?cacheBust=1412148166275 HTTP/1.1 
Host: genortal.com 
Connection: keep-alive 
Content-Length: 12 
Cache-Control: no-cache 
Pragma: no-cache 
Origin: http://genortal.com 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 
Content-type: application/x-www-form-urlencoded 
Accept: */* 
Referer: http://genortal.com/dashboard.php 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 

Response Headers:

HTTP/1.1 200 OK 
Date: Wed, 01 Oct 2014 07:22:46 GMT 
Server: Apache/2.4.7 (Ubuntu) 
X-Powered-By: PHP/5.5.9-1ubuntu4.3 
Expires: Sat, 01 Jan 2005 00:00:00 GMT 
Cache-Control: no-cache, no-store 
Pragma: no-cache 
Last-Modified: Wed, 01 Oct 2014 07:22:47GMT 
Content-Length: 117 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: application/json 

Серверный код:

<?php 
/** 
* Generation Portal 
* Date: 24/9/14 
* Time: 8:59 PM 
*/ 

require_once '../../start_session.php'; 
require_once '../../libload.php'; 

use GenerationPortal\Genortal\Accounts\Session; 
use GenerationPortal\Genortal\RequestIn; 
use GenerationPortal\Genortal\ErrorDictionary\AjaxErrors; 
use GenerationPortal\Genortal\AjaxHandler; 
use GenerationPortal\Genortal\Explorer\Navigator; 
use GenerationPortal\Genortal\Storage\DatabaseLayer; 
use GenerationPortal\Genortal\FileSystem\FileSystem; 

header("Expires: Sat, 01 Jan 2005 00:00:00 GMT"); 
header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT"); 
header("Cache-Control: no-cache, no-store"); 
header("Pragma: no-cache"); 

$requestIn = new RequestIn(); 

$ajaxHandler = new AjaxHandler(); 

if(!Session::loggedIn()) { 

    $ajaxHandler->error('not_signed_in',AjaxErrors::desc('not_signed_in')); 

} 

if(!$requestIn->paramSet('path')) { 

    $ajaxHandler->error('missing_parameters',AjaxErrors::desc('missing_parameters')); 

} 

$navigator = new Navigator(); 

try { 

    $databaseLayer = new DatabaseLayer(); 

    $fileSystem = new FileSystem(Session::uid(),$requestIn->param('path'),$databaseLayer); 

} catch (\Exception $e) { 

    $ajaxHandler->error('server_error',AjaxErrors::desc('server_error')); 

} 

$ajaxHandler->respond($navigator->parseDirectoryListing($fileSystem)); 

Может ли кто-нибудь быстро помочь в том, что происходит Вот? Это работа кеширования HTTP?

+0

0 комментариев – meda

+0

@meda извинения, я не понимаю, что вы пытаетесь сказать ... –

+0

@abhishek он просит вас показать код, а не просто объяснить его в ваши собственные слова. посмотрите на сетевую активность браузера - где и как отправляются эти запросы. – Cheery

ответ

1

Проблема не с кодом, браузером или HTTP-кэшированием.Проблема была в моей операционной системе. Соединение не отключилось даже после того, как я отключил его. Я решил перезапустить свой рабочий стол.

Извиняется за то, что вы потратили немного времени! Благодарю.

3

Для этого вам следует попытаться использовать переработку кеша. Я имею в виду передать дополнительный параметр & это переменное с URL-то вроде этого

www.mydomain.com/navigate.php; //url without cache bust parameter 
myRand=parseInt(Math.random()*99999999); 
www.mydomain.com/navigate.php?rand=54321 //url with cache bust parameter 

Таким образом, в кэше выше ваш сервер будет понимать его как новый запрос.

+0

Внимательно прочитайте вопрос .. 'Я добавил кэш-бюст (new Date(). getTime()), но изменений не было. – Cheery

+0

@ram Я уже добавляю текущую временную метку, как я уже упоминал в вопросе –

+0

@abhishek, пожалуйста, поделитесь своим кодом в этом случае –